返回局部变量是否会返回副本并销毁原始变量(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中文网其他相关文章!