使用局部变量或访问多次结构值(C++)

问题描述:

在JS它一个很好的做法,创建一个变量,重用,而不是访问在一个很深的对象结构中的值:使用局部变量或访问多次结构值(C++)

for (var i = 0, l = arr.length; i < l; ++i) { 
    var someValueINeedOftenHere = arr[i].path.to.value; 
    // do several things with this var.. 
} 

所以不是在这个深层次的对象结构中寻找价值,我们将其存储在本地,我们可以一遍又一遍地重复使用它。这应该是一个好的做法,不仅因为它可以让你编写更干净的代码,而且还因为性能。因此,当我编写C++代码时,我必须迭代一个载有很多结构体/对象的向量。那么是一样的,还是无所谓?

+1

我想你会发现你的问题的答案[在这个主题](http:// *。COM /问题/ 5133675 ​​/ C-结构-慢于访问高于基本变量)。祝你好运。 – Mirza

一般来说,在C/C++中并不重要。在C和C++中,每个结构的内存布局在编译时是已知的。当你输入arr[i].path.to.value时,这将与*(&arr[0] + i * (something) + offset_1 + offset_2 + offset_3)基本相同,并且在编译时将简化为类似*(&arr[0] + i * (something) + something)的所有内容。并且这些something将由编译器计算并硬编码到二进制文件中,因此有效查找arr[i].path.to不会比arr[i].path.to.value更快。

据我所知,这不是标准或任何东西的要求,但它是大多数编译器实际工作的方式。

如果你想在一些特定的情况下,可以肯定的,你可以看看godbolt,看看它装配了厨师:http://gcc.godbolt.org/

请注意,我假设当你的局部变量,你正在服用对值arr[i].path.to.value的引用,这与您在JavaScript中执行的操作最为相似。如果你真的把这个值复制到一个新的变量中,那么这会产生一些拷贝开销。我不认为复制它会有利于w.r.t.缓存未命中,除非使用模式非常复杂。一旦你访问了arr[i].path.to.value一次,它周围的所有东西都会在缓存中,并且没有理由将其复制到堆栈上会使任何事情都变得更快。

+0

Thx。所以,这只会简化我的代码,但它不会真的影响性能,对吧? – webdeb

+0

是的,没错 –

不要紧,如果没有的arrarr[i]pathtovalue是/包括引用/指针,作为pointed out by Chris Beck

但是,如果任何的arrarr[i]pathtovalue是/涉及参照/指针然后访问它们将可能成为一个高速缓存未命中。多次访问它们会导致多次缓存未命中(可能)。

直接存储参考/指针到value可能因此比追踪指针到达value时获取多个高速缓存未命中更有效。请记住,编译器可能会优化这样的事情。

作为副本存储value可能会更有效,如果它避免缓存未命中,并且它的副本相对较轻,并且不需要修改原始值。同样,编译器最有可能优化这些情况,如果清楚这样做会提高性能。

这一切都取决于。 只有在已证明是问题时才进行优化。