c++11 - 在返回右值移动期间,是否有堆栈拷贝?

标签 c++ c++11 compiler-construction

看着这个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/

相关文章:

java - java中sql的解析器

visual-studio - 未知的构建错误, 'Exception of type ' System.OutOfMemoryException' 被抛出

c++ - 在 C++ 中生成和存储随机数组

c++ - 在 C++ 中绘制线条

c++ - 模板元编程 NamedPipe 客户端服务器

c++ - 当进程死亡时, fork 进程内的分离线程会发生什么?

c++ - 使用 SFINAE 检查类型是否可以绑定(bind)到模板模板参数

c++ - 忽略丢失的 .obj 文件或 "/P switch + external tool + linker = hell"

c++ - Boost Log 清除日志文件

c++ - &string 和 &string[0] 的内存地址不同?