为什么从函数返回lvalue的结果是main()函数中的对象main()具有与get_vec()函数中返回的对象std::vector<int> vec相同的内存地址,即使这些对象存在于不同的堆栈帧中?
为什么没有所谓的移动构造函数?
#include <iostream>
#include <vector>
std::vector<int> get_vec()
{
std::vector<int> vec = { 1, 2, 3, 4, 5 };
std::cout << "get_vec():\n" << &vec << '\n' << vec.data() << "\n\n";
return vec;
}
int main()
{
std::vector<int> v = get_vec();
std::cout << "main():\n" << &v << '\n' << v.data() << "\n\n";
return 0;
}OUTPUT:
get_vec():
0x7a07ee93baa0
0x226b290
main():
0x7a07ee93baa0
0x226b290发布于 2022-06-26 10:54:03
vec要么被移动(因为您是返回局部变量,这是自动的),或者,如果编译器足够聪明,则是与v相同的对象(这称为NRVO)。
在这两种情况下,.data()都将保持不变。当移动时,新向量获得另一个向量的堆内存的所有权。
&vec,只有当编译器执行NRVO时,&v才会是相同的。
发布于 2022-06-26 10:53:43
您正在使用v的结果初始化get_vec,并且返回值将经历复制省略。
在内部,C++调用约定有一个寄存器,用于通过传入指向存储的指针来返回结构。因此,调用被转换为:
void get_vec(std::vector<int> &out);函数在main中获得对v的引用,因此在这两种情况下地址都是相同的。
https://stackoverflow.com/questions/72760907
复制相似问题