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

web*_*deb 3 c++ performance local-variables

在 JS 中,创建一个变量以进行重用是一个很好的做法,而不是访问深层对象结构中的值:

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

因此,我们不是在这个深层对象结构中查找值,而是将其存储在本地,并且可以一遍又一遍地重用它。这应该是一个很好的实践,不仅因为它可以让您编写更干净的代码,而且还因为性能。

因此,当我编写 C++ 代码时,我必须迭代一个包含大量结构/对象的向量。那么是一样的,还是没有关系?

Chr*_*eck 5

一般来说,在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/

请注意,我假设当您创建局部变量时,您正在引用 value arr[i].path.to.value,这与您在 javascript 中所做的最相似。如果您实际上将值复制到新变量,那么这将产生一些复制开销。我不认为复制它对于缓存未命中来说是有利的,除非使用模式非常复杂。一旦访问arr[i].path.to.value一次,它周围的所有内容都将位于缓存中,并且将其复制到堆栈上没有理由会使速度更快。