我想知道访问大型数据结构的最佳方式(性能方面)是什么。 有大约一百种方法可以做,但编译器最容易获得哪些优化?
可以通过
访问值foo[someindex].bar[indexlist[i].subelement[j]].baz[0]
或创建一些指针别名,如
sometype_t* tmpfoo = &foo[someindex];
tmpfoo->bar[indexlist[i].subelement[j]].baz[0]
或创建像
这样的参考别名sometype_t &tmpfoo = foo[someindex];
tmpfoo.bar[indexlist[i].subelement[j]].baz[0]
依此类推......
答案 0 :(得分:5)
过早优化是万恶之源。编写清晰的代码,如果它太慢,请对其进行分析并查看花费的时间并在那里进行优化。
话虽如此,编译器有99%的可能性为这三个示例生成相同的代码。
答案 1 :(得分:1)
你在这里描述的所有三个都将编译(使用一个不错的编译器)同样的东西。
答案 2 :(得分:0)
作为个人偏好,我通常会发现,如果遍历的嵌套级别较少,则更容易阅读和理解。因此,我倾向于使用......
SomeType *pSomeType = &asManyLevelsAsItMakesSense[someIndex];
pSomeType->subSomeNestedLevels = ...;
我发现这在处理循环中的深层嵌套结构时特别有用。识别不变的嵌套部分并将其提升出循环。
SomeType *pSomeType = &...;
for (i = 0; i < N; i++)
pSomeType->field[i] = ...;
与往常一样,了解您的编译器及其实际生成的内容值得您花些时间。有时候你可能会遇到一个没有优化的项目编译器,所以这样的小事情就会产生影响(但不要以为它会有所不同)。