【发布时间】:2014-10-16 16:29:53
【问题描述】:
如果我有一个包含结构数组的结构......然后
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();
或者效率损失的级别数量是否有限制,编译器优化是否有任何影响?
非常感谢您提供的任何见解。
【问题讨论】:
-
就个人而言,我认为第二种方式更好。这取决于编译器,但如果您关心效率,则不应在编译器的假设下编写代码。
-
为了我的理智,我几乎总是在适用时使用一个命名良好的中间变量。由编译器来担心它选择执行的任何这样的小优化。 (即使它没有执行任何此类优化,并且程序运行得足够快 - 谁在乎?不是我。)
-
与任何这些类型的问题一样,最好的方法是计时。我怀疑编译器(和优化设置)之间可能会有所不同,而且我还怀疑任何差异都会非常非常小。代码的可读性可能胜过任何差异。
-
唯一确定的方法是写下两者并比较它们的性能。我的直觉告诉我,任何差异都是微不足道的,但你永远不会知道。话虽如此,首先是正确性的代码,然后是可读性/可维护性。不要在几个周期内牺牲意图的清晰性除非您未能满足硬性能要求。
-
@JohnBode 一般来说,你是对的。但在这种情况下,一些底层知识就足以知道两个变体应该表现出完全相同的性能。 “应该”,因为编译器有时做非常疯狂的事情。
标签: c performance indirection multiple-indirection