NRVO-是该程序定义良好的输出
NRVO - Is the output of this program well defined?
#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
我对未调用复制构造函数的猜测(尽管它具有可观察到的副作用),而对象a
在f()
中未被破坏)是NRVO(与以下内容相似:https://stackoverflow.com/a/3906038/1857518)。
我的问题:
- 该程序的输出是由C 标准指定的吗?
- 如果(1)为真,则以下哪种是:
- 输出将始终是此
- 存在法律&amp;有限的输出集,例如
Out
(例如|Out| > 1
)。一致的编译器可以从集合Out
产生任何一个。如果是这种情况,则集合Out
是什么样的。
您在此行为中看到的是 copy Elision 。
1.是该程序的输出,由C 标准指定?
是的,允许编译器优化这种情况的复制副作用。
2.输出将始终是此
否。如上所述
因此,您不能依靠存在的任何副作用,也不能删除返回的"副本"。另请参阅这篇文章:是否可以确保复制Elision?
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 自定义runtime_error,如果我在 #what 中使用#c_str(),则错误输出始终为空
- 如何处理自定义输出运算符中的 iomanips?
- 在程序执行期间从标准输出重定向到自定义流
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- 自定义堆栈上 std::string 数据的输出
- std::cout 如果从自定义分配器 (Visual Studio 2019) 调用,则不会输出
- 如何基于自定义逻辑逐个输出序列
- 自定义输出分辨率重复输出DXGI
- 根据 boost::iterator_facade 定义基于代理的输出迭代器
- 如何为提升日志和自定义类型定义输出流运算符
- 如何获取外部项目定义的目标的输出路径?
- GCC -FROFILE -ARCS:如何在自定义RTO上输出文件
- 使用向量(STL)时,未定义的行为,请说明理性背后的以下代码输出
- C++使用 shell 命令 WINDOWS 的输出定义宏 /D
- CGI程序的自定义输出缓冲区,运算符重载
- 在返回之前等待输出的自定义QProcess对象
- 输出用户定义的结构使用boost ::日志
- NRVO-是该程序定义良好的输出
- C++定义了long-long,但输出是有限的