我知道这个问题已经讨论过好几次了,但我找不到一篇文章来解释为什么需要在增量后的情况下复制一份。
引用堆叠溢出回复:
int j = i++; // j will contain i, i will be incremented.
int j = ++i; // i will be incremented, and j will contain i+1.当考虑后置/预增量的定义时,这是完全有意义的。许多时候,当比较前后增量的性能时,人们认为,增量需要复制,增量需要复制,而增量前增量只需要增加值,而不需要创建副本。
虽然在数十个职位上都比较了业绩,但我实在找不到任何解释,为何在增加职位的情况下要复制。为什么它不返回旧值,然后将变量的值递增一个(或者操作符被重载的方式),而不是创建一个新的对象并返回那个对象。
发布于 2015-06-19 15:33:18
不同的是,someval++返回增量之前的someval,要做到这一点,您需要记住someval与副本的关系。否则,如果原始值没有存储在某个地方,您将如何在更新原始值的同时返回原始值?
发布于 2015-06-19 15:39:36
将增量前和增量后操作符视为标准函数:
// ++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++)中,必须在执行增量之前执行值的副本。
发布于 2015-06-19 15:41:41
对于我来说,很难说编译器是如何优化增量前和增量后操作符的,这样就不一定会在原始类型上复制。
我可以展示如何为增量后操作符的用户定义类型创建副本。
让我们简单地看一下std::vector::iterator。
假设迭代器除了存储其他内容之外,还存储了一个索引。
struct iterator
{
size_t index;
iterator operator++(int )
{
iterator copy = *this;
this->index++;
return copy;
}
};在这种情况下,不可能首先返回*this,然后增加索引。创建一个副本,递增this的索引,然后返回该副本,我们就可以保留该操作的语义。
https://stackoverflow.com/questions/30941980
复制相似问题