在C语言中,更多级别的间接寻址是否会对性能产生影响
如果我有一个包含结构数组的结构。。。。等等在C语言中,更多级别的间接寻址是否会对性能产生影响,c,performance,indirection,multiple-indirection,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(); 或者对于效率损失的级别数
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();
或者对于效率损失的级别数量是否有限制,编译器优化是否有任何影响
非常感谢您提供的任何见解 间接寻址的级别确实会对CPU周期和可读性产生影响。但是,在您的情况下,只有一个间接级别(函数指针)。点运算符在编译时生成到
config
位置的偏移量
不管怎样,创建一个变量来保存公共子表达式的结果是一个好主意,特别是当您给该变量一个有意义的名称时。但是,在CPU方面,您应该看不到任何影响:优化编译器现在在检测和优化公共子表达式方面非常出色,因此,无论您以何种方式编写这个特定的代码片段,您都应该看到相同的性能。即使您进行了直接的间接级别,如a->b,其中可能会出现缓存和性能问题,也需要仔细检查,即使是看起来无辜的a.b.c[x].d,因为[x]很可能会将您推出缓存 因此,答案实际上是它取决于缓存中的内容、缓存的大小以及结构的大小 唯一真实的方法是在代码将被使用的情况下测试代码。您甚至不能单独测试它,因为这样会在缓存利用率方面给出错误的结果
简言之,我想,在测试并证明存在问题之前,甚至不用担心优化,然后看看重组结构字段或避免derefs是否有帮助……就个人而言,我认为第二种方法更好。这取决于编译器,但如果您关心效率,则不应在编写代码时假设编译器是正确的。出于理智考虑,我几乎总是在适用时使用一个名称良好的中间变量。编译器有责任担心它选择执行的任何此类小优化。(即使它没有执行任何这样的优化,而且程序运行速度足够快——谁在乎呢?不是我。)对于这些类型的问题,最好的方法就是计时。我怀疑编译器(和优化设置)之间可能存在差异,我也怀疑任何差异都非常小。代码的可读性可能胜过任何差异。唯一确定的方法是写下它们并比较它们的性能。我的直觉告诉我,任何差别都是微不足道的,但你永远不会知道。话虽如此,代码首先是正确性,然后是可读性/可维护性。除非您未能满足严格的性能要求,否则不要在几个周期内牺牲意图的清晰性。@JohnBode一般来说,您是对的。但在这种情况下,一些低层次的知识足以知道两种变体应该显示完全相同的性能。“应该”,因为编译器有时会做一些非常疯狂的事情。这里没有间接层次。OP应该有,但没有。您可以直接访问
item
@KarolyHorvath,userFunction
是一个指针,因此两个表达式中的间接级别是相同的。谢谢,这就是我的意思。从比较这两种方法的角度来看,没有区别。