为啥在 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+1
、x+=1
、x++
和 ++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++) 快? [复制]的主要内容,如果未能解决你的问题,请参考以下文章