gpt4 book ai didi

c++ - 函数值返回的对象的地址

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:38 24 4
gpt4 key购买 nike

考虑以下最少的代码:

class MyClass {
public:
MyClass() {}
};

MyClass myfunc() {
MyClass obj;
cout << "Address of obj in myFunc " << &obj << endl;
return obj;
}

int main() {
MyClass obj(myfunc());
cout << "Address of obj in main " << &obj << endl;
return 0;
}

我得到以下输出:

Address of obj in myFunc 0x7fff345037df
Address of obj in main 0x7fff3450380f

现在,只需在 MyClass 中添加一个析构函数,我就会得到以下输出:

Address of obj in myFunc 0x7fffb6aed7ef
Address of obj in main 0x7fffb6aed7ef

显示两个对象现在相同...这只是巧合吗?!

此外,究竟发生了什么:

MyClass obj(myfunc());

我重载了复制构造函数来打印一条消息,但它从未出现过......

最佳答案

通过添加析构函数(无论您实际执行的是什么,都不会显示代码),行为会更改为使用返回值优化,即 RVO。

然后将指向调用者存储的指针传递给函数,函数直接在该存储中构造对象,而不是例如复制处理器寄存器或寄存器组中的值。

相同的调用约定,带有隐藏的结果存储指针,也可以在没有 RVO 的情况下使用。如果没有 RVO,则在函数结束时执行复制或移动。该标准在某些条件下支持 RVO 优化,但是,尽管可以合理预期,编译器没有任何义务执行 RVO。

关于c++ - 函数值返回的对象的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22663277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com