NRVO-是该程序定义良好的输出

NRVO - Is the output of this program well defined?

本文关键字:输出 定义 程序 NRVO-      更新时间:2023-10-16
#include <iostream>
using namespace std;
int gc = 0;
struct A {
    int id;
    A():id(gc++) { cout << "Constructed #" << id << "n"; }
    A(const A& b):id(gc++) { cout << "Copying from " << b.id << " to " << id << "n"; }
    ~A() { cout << "Destructed #" << id << "n"; }
};
A f() {
    A a;
    cout << "Exiting f()" << "n";
    return a;
}
int main() {
    A b = f();
    cout << "Exiting main()" << "n";
    return 0;
}

产生的输出(没有优化(-O0),并使用这些编译器中的任何一个:G 4.6.3,G 4.8.1,clang 3.0在Ubuntu上):

Constructed #0
Exiting f()
Exiting main()
Destructed #0

我对未调用复制构造函数的猜测(尽管它具有可观察到的副作用),而对象af()中未被破坏)是NRVO(与以下内容相似:https://stackoverflow.com/a/3906038/1857518)。

我的问题:

  1. 该程序的输出是由C 标准指定的吗?
  2. 如果(1)为真,则以下哪种是:
    • 输出将始终是此
    • 存在法律&amp;有限的输出集,例如Out(例如|Out| > 1)。一致的编译器可以从集合Out产生任何一个。如果是这种情况,则集合Out是什么样的。

您在此行为中看到的是 copy Elision

1.是该程序的输出,由C 标准指定?

是的,允许编译器优化这种情况的复制副作用。

2.输出将始终是此

否。如上所述

因此,您不能依靠存在的任何副作用,也不能删除返回的"副本"。另请参阅这篇文章:是否可以确保复制Elision?