【问题标题】:Preincrement faster than postincrement in C++ - true? If yes, why is it? [duplicate]在 C++ 中,前增量比后增量快 - 是吗?如果是,为什么? [复制]
【发布时间】:2011-01-02 11:22:26
【问题描述】:

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

我听说 C++ 中的前置增量 (++i) 比后置增量 (i++) 快一点。真的吗?这是什么原因?

【问题讨论】:

  • 重复、重复和更多重复:stackoverflow.com/search?q=[c%2B%2B]+i%2B%2B+%2B%2Bi
  • 哪个硬件平台。 PDP-11 硬件特性的原始前置增量和后置增量。由于机器的工作方式,速度是相同的。使用了哪些特定硬件?
  • 使用今天的优化编译器,没有区别(我的意思是简单类型)。不同之处在于向任何阅读您的代码的人表明您的意图

标签: c++


【解决方案1】:

后增量通常涉及保留先前值的副本并添加一些额外的代码。预增量只是完成它的工作并且不碍事。我通常会预先递增,除非语义会发生变化并且实际上需要后递增。

【讨论】:

  • 内置类型是否如此取决于您实际使用运算符的方式。对于用户定义的类型,这取决于您如何实现运算符。
  • @Neil -- 合格,现在。
  • 换句话说:i++ 等价于 {auto temp(i); increment(i);return temp;},++i 等价于 {increment(i); return i;} 因此该副本是不同的。
  • 当增量表达式的值 of 未被以任何身份引用时,编译器优化差异的常见程度如何?
【解决方案2】:

后增量必须复制对象以返回未增量的值。对于类类型,这可能很重要,但对于“类 int”类型(包括指针),它可能不是。

【讨论】:

    【解决方案3】:

    实际上 - 这取决于。 Postincrement 需要一个副本,因为它保留了旧值。如果增量类型是复杂类型(例如迭代器)而不是简单类型,则前增量比后增量快。 当然,只有当您不需要增量之前的值时,这才是正确的。

    一些编译器甚至可能会检测到您不需要后增量并优化副本 - 但与往常一样 - 依赖它是一个坏习惯。

    【讨论】:

    • 不像“在这种情况下”那样“一如既往”。如果可读性受到威胁(在询问性能问题时很常见),那么将您的代码变成一堆聪明的混乱是一个坏习惯。不过,在这种情况下,它几乎是一样的。
    • 我不明白为什么“i++”比“++i”更具可读性。后增量和前增量之间的唯一区别是加法符号位置。例如,在 Linux 代码库中使用了很多预增量。一个编译器检测是否为优化分配了一个变量比忽略它的编译器更复杂,可读性更差,假设其他一切都相同,但人们并没有抱怨它。
    【解决方案4】:

    在任何体面的编译器上,如果不使用该值,++i 和 i++ 是相同的。

    如果使用该值,如果需要相同的语义,++i 将需要一个临时值来存储预增量值。

    【讨论】:

    • 你的意思是第二个语句中的 i++。
    • 不,我没有。重读我的答案。然而,我的意思是“预增量”而不是“预增量”。
    • 说法正确。他指的是增加之前的值。
    • @Richard Pennignton 我已经阅读了三遍以上,仍然不明白为什么 ++i 需要一个临时的:/。请举例说明。
    • @Mi-La,如果您需要模拟 a = x++ 的语义;使用 ++x,那么你将需要: tmp = x; ++x; a = tmp;
    【解决方案5】:

    普通类型(如 int)的差异可能可以忽略不计。我猜编译器能够优化这种情况(例如,在适当的情况下将后缀转换为前缀增量)。但是,对于复杂类型(通常是 STL 迭代器,差异可能很明显)。在这些情况下,编译器无法切换​​到前缀,因为运算符实际上可能会做完全不同的事情。我建议阅读STL Iterators and Performance,了解有关对 STL 迭代器使用后增量的性能损失的一些背景信息(短篇小说:它花费的时间是前增量的两倍)。

    【讨论】:

      猜你喜欢
      • 2012-08-24
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 2015-08-06
      • 2014-12-09
      • 2011-07-11
      相关资源
      最近更新 更多