0

如果我有一个包含结构数组的结构......等等

config.data.item[3].userFunction();

访问更好吗

itemType * item = &config.data.item;

item[3].userFunction();
item[4].userFunction();

或者这只是一样

config.data.item[3].userFunction();
config.data.item[4].userFunction();

或者效率损失的级别数量是否有限制,编译器优化是否有任何效果?

非常感谢您提供的任何见解。

4

2 回答 2

1

间接级别确实会在 CPU 周期和可读性方面产生影响。但是,在您的情况下,只有一级间接(函数指针)。config点运算符在编译时产生对位置的偏移量。

无论如何,创建一个变量来保存公共子表达式的结果是一个好主意,尤其是当您给该变量起一个有意义的名称时。然而,就 CPU 而言,您应该没有看到任何影响:如今,优化编译器在检测和优化常见子表达式方面非常出色,因此无论以何种方式编写此特定代码片段,您都应该看到相同的性能。

于 2014-08-22T18:37:59.550 回答
-1

即使你做了像 a->b 这样的直接间接级别,这可能会对缓存和性能造成影响,即使是看起来很无辜的 abc[x].d 也需要仔细检查,因为 [x] 很可能会把你赶出去的缓存。

所以答案实际上是它取决于缓存中有什么,缓存有多大以及结构的大小。

唯一真实的方法是在将要使用的情况下测试代码。你甚至不能单独测试它,因为这会给你缓存利用率的错误结果。

我想简而言之,在您测试并证明存在问题之前,甚至不要担心优化,然后看看重组结构字段或避免 derefs 是否有帮助......

于 2014-08-22T18:53:09.377 回答