为啥在 C 中前缀递增 (++x) 比后缀递增 (x++) 快? [复制]

Posted

技术标签:

【中文标题】为啥在 C 中前缀递增 (++x) 比后缀递增 (x++) 快? [复制]【英文标题】:Why is prefix incrementation (++x) faster than postfix incrementation (x++) in C? [duplicate]为什么在 C 中前缀递增 (++x) 比后缀递增 (x++) 快? [复制] 【发布时间】:2012-08-24 19:29:50 【问题描述】:

可能重复:Is there a performance difference between i++ and ++i in C?

我听说在 C 中前缀递增比后缀递增快。这是真的吗?为什么?

++x 与 x++

【问题讨论】:

不是。应该更改问题的标题以反映这一点... 标题中的“为什么”让我很兴奋,因为我期待基准测试......真是令人失望...... 不要相信你所听到的一切。 不仅可能,而且完全重复。 可能想要修改重复项,使其显示前缀和后缀增量以帮助搜索结果。我不会发布这是搜索为我找到的重复项(重复项不明确) 【参考方案1】:

这是一个不断重复的荒谬神话。这两个运算符有语义的区别;一个结果是旧值,另一个结果是新值。如果您使用此结果,代码将根据您使用的运算符具有不同的行为,如果一种行为可以比另一种更有效地实现,这可能包括性能差异。但如果不使用结果,x=x+1x+=1x++++x相同

【讨论】:

***.com/questions/24886/… 中提到了一些例外情况,例如 C80 编译器。【参考方案2】:

简短回答没有。原因是相同的操作,只是语句的求值顺序改变了。

例子:

int a = x++;
int b = ++x;

伪汇编:

mov a, x
inc x
inc x
mov b, x

这是一个微不足道的例子,但即使在更大的例子中,最糟糕的可能是内存屏障强制操作,它不允许将后增量值推入或拉过它,这只会增加一个额外的 mov 操作到期依赖或强制障碍。大多数编译器在标准情况下使用指令重新排序优化掉这个额外的mov

【讨论】:

以上是关于为啥在 C 中前缀递增 (++x) 比后缀递增 (x++) 快? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

后缀(前缀)增量、左值和右值(在 C 和 C++ 中)

递增和递减运算符

细节七

细节七

C ++迭代器取消引用和前缀递增/递减样式? *--Iter ok 风格是不是明智?

为啥我们不能递增 (++) 或递减 (--) 数字文字