C++ 访问嵌套数据结构的最佳方法?
我想知道访问大型数据结构的最佳方式(性能方面)是什么。 有大约一百种方法可以做到这一点,但是编译器最容易优化的方法是什么 可以通过以下方式访问值:C++ 访问嵌套数据结构的最佳方法?,c++,performance,nested,C++,Performance,Nested,我想知道访问大型数据结构的最佳方式(性能方面)是什么。 有大约一百种方法可以做到这一点,但是编译器最容易优化的方法是什么 可以通过以下方式访问值: foo[someindex].bar[indexlist[i].subelement[j]].baz[0] 或者创建一些指针别名,如 sometype_t* tmpfoo = &foo[someindex]; tmpfoo->bar[indexlist[i].subelement[j]].baz[0] sometype_t &
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]
或者创建引用别名,如
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]
诸如此类……您在这里描述的三个都将编译成相同的东西。您在这里描述的三个都将编译成相同的东西。过早优化是万恶之源。编写清晰的代码,如果速度太慢,请对其进行分析,看看时间花在哪里,并在那里进行优化
也就是说,99%的可能性是编译器为这三个示例生成相同的代码。过早优化是万恶之源。编写清晰的代码,如果速度太慢,请对其进行分析,看看时间花在哪里,并在那里进行优化
也就是说,99%的可能性是编译器为所有这三个示例生成相同的代码。作为个人偏好,我通常发现,如果要遍历的嵌套级别较少,则更容易阅读和理解。因此,我倾向于使用
SomeType *pSomeType = &asManyLevelsAsItMakesSense[someIndex];
pSomeType->subSomeNestedLevels = ...;
我发现这在处理循环中的深层嵌套结构时特别有用。识别不变的嵌套零件,并将其吊出循环
SomeType *pSomeType = &...;
for (i = 0; i < N; i++)
pSomeType->field[i] = ...;
SomeType*pSomeType=&。。。;
对于(i=0;ifield[i]=。。。;
和往常一样,了解编译器及其实际生成的内容是值得的。有时,您可能会被一个根本不进行优化的项目编译器所困扰,因此像这样的小事情可能会产生影响(但不要假设它会产生影响)。作为个人偏好,我通常发现,如果要遍历的嵌套级别较少,那么阅读和理解就会更容易。因此,我倾向于使用
SomeType *pSomeType = &asManyLevelsAsItMakesSense[someIndex];
pSomeType->subSomeNestedLevels = ...;
我发现这在处理循环中的深层嵌套结构时特别有用。识别不变的嵌套零件,并将其吊出循环
SomeType *pSomeType = &...;
for (i = 0; i < N; i++)
pSomeType->field[i] = ...;
SomeType*pSomeType=&。。。;
对于(i=0;ifield[i]=。。。;
和往常一样,了解编译器及其实际生成的内容是值得的。有时,您可能会被一个根本不进行优化的项目编译器所困扰,因此像这样的小事可能会产生影响(但不要认为它会产生影响)。当您测量差异时,您发现了什么?第一个选项是最慢的,可能是因为访问操作符调用过多。第二个是这三个选项中最好的一个。请更新您的问题,表明您已经知道答案,这是第二个选项。然后,请关闭问题,因为您已经知道答案,不需要我们提供任何信息。当您测量差异时,您发现了什么?第一个选项是最慢的,可能是因为接入操作员呼叫过多。第二个是这三个选项中最好的一个。请更新您的问题,表明您已经知道答案,这是第二个选项。然后,请关闭问题,因为您已经知道答案,不需要我们提供任何信息。