如果我有一个包含结构数组的结构......并且在
上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();
或者效率丢失的级别数是否有限制,编译器优化是否有效?
非常感谢您提供的任何见解。
答案 0 :(得分:1)
间接级别确实会对CPU周期和可读性产生影响。但是,在您的情况下,只有一个间接级别(函数指针)。 Dot运算符在编译时生成config
位置的偏移量。
无论如何,创建一个变量来保存公共子表达式的结果是一个好主意,特别是当你给该变量一个有意义的名字时。然而,就CPU而言,您应该看不出任何影响:优化编译器现在在检测和优化常见子表达式方面非常出色,因此您应该在编写此特定代码片段时看到相同的性能。
答案 1 :(得分:-1)
即使你有直接的间接级别,如a-> b,也会有潜在的缓存和性能损失,即使看起来无辜的abc [x] .d也需要仔细检查,因为[x]可能非常把你推出缓存。
所以问题的答案实际上取决于缓存中的内容,缓存的大小以及结构的大小。
唯一可行的方法是在将要使用的情况下测试代码。你甚至不能孤立地测试它,因为这会给你带有缓存利用率的错误结果。
我想简而言之,甚至不用担心优化,直到你测试并证明存在问题,然后看看重新组织struct字段或避免derefs有帮助......