Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,更多级别的间接寻址是否会对性能产生影响_C_Performance_Indirection_Multiple Indirection - Fatal编程技术网

在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
是一个指针,因此两个表达式中的间接级别是相同的。谢谢,这就是我的意思。从比较这两种方法的角度来看,没有区别。