Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问嵌套数据结构的最佳方法?_C++_Performance_Nested - Fatal编程技术网

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]=。。。;

和往常一样,了解编译器及其实际生成的内容是值得的。有时,您可能会被一个根本不进行优化的项目编译器所困扰,因此像这样的小事可能会产生影响(但不要认为它会产生影响)。

当您测量差异时,您发现了什么?第一个选项是最慢的,可能是因为访问操作符调用过多。第二个是这三个选项中最好的一个。请更新您的问题,表明您已经知道答案,这是第二个选项。然后,请关闭问题,因为您已经知道答案,不需要我们提供任何信息。当您测量差异时,您发现了什么?第一个选项是最慢的,可能是因为接入操作员呼叫过多。第二个是这三个选项中最好的一个。请更新您的问题,表明您已经知道答案,这是第二个选项。然后,请关闭问题,因为您已经知道答案,不需要我们提供任何信息。