我知道这个问题已经被讨论了好几次,但我找不到一篇文章解释为什么在后增操作时需要进行复制。
引用 stackoverflow 上的回复:
int j = i++; // j will contain i, i will be incremented.
int j = ++i; // i will be incremented, and j will contain i+1.
当考虑到后增量/前增量的定义时,这个解释是非常合理的。在比较前增量和后增量的性能时,通常会说后增量需要复制一份副本、对其进行增量操作并返回该副本,而前增量仅增加数值而不创建副本。
尽管已经有许多帖子比较了它们的性能,但我确实找不到任何关于为什么必须在后增量中创建一个副本的解释。为什么不返回旧值,然后将变量的值增加1(或者通过重载运算符以任何其他方式),而不是创建一个新对象并返回它。
int j = i; ++i
,所以实际上没有临时变量(尽管编译器完全符合 as-if 规则)。但在某些情况下并不那么容易,特别是对于具有非平凡构造函数的类型,或者考虑到禁止这种自由指令重排序的屏障/内存模型。 - Damon