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

在 C 17 中返回局部变量是否会返回副本并破坏原始变量 (NRVO)?

Mary-Kate Olsen
发布: 2024-11-22 06:50:15
原创
366 人浏览过

Does Returning a Local Variable in C  17 Return a Copy and Destroy the Original (NRVO)?

返回局部变量是否会返回副本并销毁原始变量(NRVO)?

在 C 17 中,当启用优化时(特别是(称为返回值优化或 NRVO),返回局部变量不涉及复制原始对象。相反,编译器会优化代码以将返回的对象直接构造到存储中,否则该对象将被复制到存储中。这意味着原始对象被有效地移动到返回值位置,并且不会调用析构函数。

但是,如果禁用优化(使用 -fno-elide-constructors 标志),则遵循默认行为:

  • 局部变量正常构造。
  • 然后移动或复制局部变量(取决于其可移动性)到返回值位置。
  • 原始局部变量被破坏。

在您提供的代码中:

test function() {
    test i(8);
    return i;
}
登录后复制

启用 NRVO 后,只有一个构造函数观察到析构函数调用,说明原来的 i 对象被移动到了返回值位置,没有进行复制。

和NRVO 禁用,原始 i 对象和返回值对象都观察到构造函数和析构函数调用,表明原始 i 对象被复制,然后被析构。

因此,您的问题的答案取决于是否或未启用优化。启用 NRVO 后,返回局部变量不会返回副本,也不会破坏原始变量。禁用 NRVO 后,它会返回副本并销毁原始副本。

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

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