了解局部变量的返回行为
从函数返回局部变量时,其行为可能会因编译器优化而异。
NRVO(命名返回值优化)
启用 NRVO 时,编译器通过在返回值处直接创建返回的对象来优化返回语句。在这种情况下,不会执行任何复制,返回后原始对象将被销毁。
启用 NRVO 的输出
// With NRVO enabled, only one constructor and destructor call is made. class test { public: test(int p) { std::cout << "Constructor (test(int p)) called\n"; } ~test() { std::cout << "Destructor called\n"; } }; test function() { test i(8); return i; } int main() { test o = function(); return 0; }
输出:
Constructor (test(int p)) called Destructor called
NRVO 已禁用
要禁用 NRVO,请在编译期间使用 -fno-elide-constructors 标志。在这种情况下,编译器不会执行 NRVO,并在返回值中创建对象的副本。
禁用 NRVO 的输出
// With NRVO disabled, both constructor and destructor calls are made twice. class test { public: test(int p) { std::cout << "Constructor (test(int p)) called\n"; } test(test&& other) { std::cout << "Constructor (test(test&& other)) called\n"; } ~test() { std::cout << "Destructor called\n"; } }; test function() { test i(8); return i; } int main() { test o = function(); return 0; }
输出:
Constructor (test(int p)) called Constructor (test(test&& other)) called Destructor called Destructor called
总结
以上是命名返回值优化 (NRVO) 如何影响局部变量返回行为?的详细内容。更多信息请关注PHP中文网其他相关文章!