首页 > 后端开发 > C++ > 按值返回局部变量会破坏原始对象吗?

按值返回局部变量会破坏原始对象吗?

DDD
发布: 2024-11-09 13:15:02
原创
853 人浏览过

Does Returning a Local Variable by Value Destroy the Original Object?

复制消除和对象生命周期

当按值返回局部变量时,人们可能会想知道原始对象是否被销毁。答案在于理解复制省略。

使用复制省略 (NRVO)

启用优化(称为命名返回值优化或 NRVO)时,编译器可能会通过将对象直接构造到本来会复制到的存储中来优化返回语句。因此,最初并没有创建原始对象。

启用 NRVO 的示例

考虑以下代码:

class Test {
public:
    Test(int p) { cout << "Constructor called" << endl; }
    ~Test() { cout << "Destructor called" << endl; }
};

Test function() {
    Test t(5);
    return t;
}

int main() {
    Test o = function();
    return 0;
}
登录后复制

启用 NRVO 后,输出将是:

Constructor called
Destructor called
登录后复制

仅构造和销毁对象 o,并且原始对象 t 被优化掉。

没有复制消除

禁用优化时(例如 -fno-elide-constructors),返回语句将遵循通常的复制/移动语义。

禁用 NRVO 的示例

使用上面禁用 NRVO 的代码,输出将是:

Constructor called
Constructor called
Destructor called
Destructor called
登录后复制

这次,对象 t 和 o 都被构造和销毁,因为复制/移动构造不能

结论

按值返回局部变量是否会破坏原始对象取决于是否启用了 NRVO。使用 NRVO,原始对象可能会被删除,而如果没有 NRVO,它将按照标准复制/移动语义进行复制/移动。

以上是按值返回局部变量会破坏原始对象吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板