首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数返回值

函数返回值
EN

Stack Overflow用户
提问于 2022-06-26 10:49:22
回答 2查看 50关注 0票数 0

为什么从函数返回lvalue的结果是main()函数中的对象main()具有与get_vec()函数中返回的对象std::vector<int> vec相同的内存地址,即使这些对象存在于不同的堆栈帧中?

为什么没有所谓的移动构造函数?

代码语言:javascript
复制
#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;
}
代码语言:javascript
复制
OUTPUT:
get_vec():
0x7a07ee93baa0
0x226b290

main():
0x7a07ee93baa0
0x226b290
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-26 10:54:03

vec要么被移动(因为您是返回局部变量,这是自动的),或者,如果编译器足够聪明,则是与v相同的对象(这称为NRVO)。

在这两种情况下,.data()都将保持不变。当移动时,新向量获得另一个向量的堆内存的所有权。

&vec,只有当编译器执行NRVO时,&v才会是相同的。

票数 5
EN

Stack Overflow用户

发布于 2022-06-26 10:53:43

您正在使用v的结果初始化get_vec,并且返回值将经历复制省略

在内部,C++调用约定有一个寄存器,用于通过传入指向存储的指针来返回结构。因此,调用被转换为:

代码语言:javascript
复制
void get_vec(std::vector<int> &out);

函数在main中获得对v的引用,因此在这两种情况下地址都是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72760907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档