看着这个question让我想知道如何实现。这是从问题中借用的代码:
std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return tmp;
}
std::vector<int> &&rval_ref = return_vector();
所以 tmp
是从函数 return_vector
的栈中分配的,现在这个栈内存被位于上层的 rval_ref
重新使用堆。这里有 2 个独立的堆栈,引擎盖下是否有内存拷贝?如果是这样,它会消耗 CPU 周期,这似乎有悖于“移动”的语义。
但如果不是,则必须对下层栈表进行分段,即切出一部分,以便在释放栈时保留该部分。
我不知道编译器实现,只是好奇,很难找到答案。或者,也许我完全错过了一些东西。
[更新] 感谢 Ben 的及时回复,是的,vector 实际上分配了堆内存。这是一个不好的例子,但我看到评论提到它实际上是由调用者堆栈管理的一个内存区域,这对我来说很有意义。期待更深入的回复。
最佳答案
std::vector
只包含少量记账数据,对真正的内容采用动态分配。
移动它将导致簿记数据的拷贝,但不会复制主要数据,而是将指向堆分配的指针转移到新对象。
关于c++11 - 在返回右值移动期间,是否有堆栈拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25829479/