gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:43 25 4
gpt4 key购买 nike

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

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

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

因此,当我编写 C++ 代码时,我必须遍历一个包含大量结构/对象的 vector 。那么是一样的,还是无所谓的?

最佳答案

一般来说,在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,它周围的所有东西都会在缓存中,并且没有理由将它复制到堆栈上会让任何事情变得更快。

关于c++ - 使用局部变量或多次访问结构值 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32417540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com