更多级别的间接性会对C产生性能影响

时间:2014-08-22 18:29:51

标签: c performance indirection multiple-indirection

如果我有一个包含结构数组的结构......并且在

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();

或者效率丢失的级别数是否有限制,编译器优化是否有效?

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-1)

即使你有直接的间接级别,如a-> b,也会有潜在的缓存和性能损失,即使看起来无辜的abc [x] .d也需要仔细检查,因为[x]可能非常把你推出缓存。

所以问题的答案实际上取决于缓存中的内容,缓存的大小以及结构的大小。

唯一可行的方法是在将要使用的情况下测试代码。你甚至不能孤立地测试它,因为这会给你带有缓存利用率的错误结果。

我想简而言之,甚至不用担心优化,直到你测试并证明存在问题,然后看看重新组织struct字段或避免derefs有帮助......