首页 > 后端开发 > C++ > 正文

命名返回值优化 (NRVO) 如何影响局部变量返回行为?

Barbara Streisand
发布: 2024-11-09 09:03:02
原创
779 人浏览过

How Does Named Return Value Optimization (NRVO) Affect Local Variable Return Behavior?

了解局部变量的返回行为

从函数返回局部变量时,其行为可能会因编译器优化而异。

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 后,返回局部变量无需副本,直接在返回站点构造对象,并立即销毁原始对象。
  • 禁用 NRVO 后,将创建并返回对象的副本,从而产生对象的两个副本。

以上是命名返回值优化 (NRVO) 如何影响局部变量返回行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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