首页  >  文章  >  后端开发  >  在 C 17 中返回局部变量会破坏原始变量吗?

在 C 17 中返回局部变量会破坏原始变量吗?

DDD
DDD原创
2024-11-11 11:22:03833浏览

Does Returning a Local Variable in C  17 Destroy the Original?

返回局部变量会破坏原始变量吗?

在 C 17 中,返回局部变量是否返回副本或破坏原始变量取决于是否启用优化。

使用优化 (NRVO)

启用优化(称为命名返回值优化或 NRVO),编译器可以直接构造将对象返回到将被复制/移动到的存储中。这意味着原始局部变量不会被破坏。

不进行优化

如果禁用优化(使用 -fno-elide-constructors),则禁用 NRVO。局部变量将正常构造,将执行复制或移动,原始变量将被销毁。

示例

考虑以下代码:

class test {
public:
    test(int p) { cout << "Constructor: " << this << endl; }
    test(test&& c) noexcept { cout << "Move Constructor: " << this << endl; }
    ~test() { cout << "Destructor: " << this << endl; }
};

test function() {
    test i(8);
    return i;
}

经过优化的输出 (NRVO):

Constructor: 0x7fff78e42887
Destructor: 0x7fff78e42887

未经优化的输出:

Constructor: 0x7ffda9d94fe7
Move Constructor: 0x7ffda9d95007
Destructor: 0x7ffda9d94fe7
Destructor: 0x7ffda9d95007

在优化中在这种情况下,只有一个对象被构造和销毁。在未优化的情况下,由于制作了临时副本,两个对象被构造和销毁。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn