为什么从函数返回左值的结果是main()
函数中的对象std::vector<int> v
与get_vec()
函数中的返回对象std::vector<int> vec
具有相同的内存地址,即使这些对象存在于不同的堆栈帧中?
为什么不调用move构造函数?
#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() << "nn";
return vec;
}
int main()
{
std::vector<int> v = get_vec();
std::cout << "main():n" << &v << 'n' << v.data() << "nn";
return 0;
}
OUTPUT:
get_vec():
0x7a07ee93baa0
0x226b290
main():
0x7a07ee93baa0
0x226b290
vec
要么被移动(自动地,因为你返回了一个局部变量),要么,如果编译器足够聪明,与v
是相同的对象(这被称为NRVO)。
在这两种情况下,.data()
将保持不变。移动后,新向量占有另一个向量的堆内存。
&vec
,&v
只有在编译器执行NRVO时才相同。
您正在使用get_vec
的结果初始化v
,并且返回值经过复制省略。
c++调用约定内部有一个寄存器,用于通过传递指向存储的指针返回结构体。因此调用被转换为:
void get_vec(std::vector<int> &out);
函数在main中获得对v
的引用,因此在两种情况下地址是相同的。