首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么增量后需要复制,而预增量不需要复制?

为什么增量后需要复制,而预增量不需要复制?
EN

Stack Overflow用户
提问于 2015-06-19 15:31:11
回答 3查看 2.5K关注 0票数 10

我知道这个问题已经讨论过好几次了,但我找不到一篇文章来解释为什么需要在增量后的情况下复制一份。

引用堆叠溢出回复:

代码语言:javascript
复制
int j = i++; // j will contain i, i will be incremented.
int j = ++i; // i will be incremented, and j will contain i+1.

当考虑后置/预增量的定义时,这是完全有意义的。许多时候,当比较前后增量的性能时,人们认为,增量需要复制,增量需要复制,而增量前增量只需要增加值,而不需要创建副本。

虽然在数十个职位上都比较了业绩,但我实在找不到任何解释,为何在增加职位的情况下要复制。为什么它不返回旧值,然后将变量的值递增一个(或者操作符被重载的方式),而不是创建一个新的对象并返回那个对象。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-19 15:33:18

不同的是,someval++返回增量之前的someval,要做到这一点,您需要记住someval与副本的关系。否则,如果原始值没有存储在某个地方,您将如何在更新原始值的同时返回原始值?

票数 12
EN

Stack Overflow用户

发布于 2015-06-19 15:39:36

将增量前和增量后操作符视为标准函数:

代码语言:javascript
复制
// ++i
int pre_increment(int &i) {
    i = i + 1;
    return i;
}

// i++
int post_increment(int &i) {
    int original_i = i;
    i = i + 1;
    return original_i;
}

这将帮助您理解为什么在第二种情况(i++)中,必须在执行增量之前执行值的副本。

票数 10
EN

Stack Overflow用户

发布于 2015-06-19 15:41:41

对于我来说,很难说编译器是如何优化增量前和增量后操作符的,这样就不一定会在原始类型上复制。

我可以展示如何为增量后操作符的用户定义类型创建副本。

让我们简单地看一下std::vector::iterator

假设迭代器除了存储其他内容之外,还存储了一个索引。

代码语言:javascript
复制
struct iterator
{
   size_t index;

   iterator operator++(int )
   {
      iterator copy = *this;
      this->index++;
      return copy;
   }
 };

在这种情况下,不可能首先返回*this,然后增加索引。创建一个副本,递增this的索引,然后返回该副本,我们就可以保留该操作的语义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30941980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档