复制消除和对象生命周期
当按值返回局部变量时,人们可能会想知道原始对象是否被销毁。答案在于理解复制省略。
使用复制省略 (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中文网其他相关文章!