返回局部变量会破坏原始变量吗?
在 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中文网其他相关文章!