返回函数的左值

  • 本文关键字:函数 返回 c++ lvalue
  • 更新时间 :
  • 英文 :


为什么从函数返回左值的结果是main()函数中的对象std::vector<int> vget_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的引用,因此在两种情况下地址是相同的。

相关内容

  • 没有找到相关文章