复制elision方法的标准定义: 在C++计算机编程中,复制elision是指消除不必要的对象复制的编译器优化技术。 让我们考虑下面的代码复制elision方法
#include <cstdlib>
#include <iostream>
using namespace std;
int n=0;
struct C
{
C (int) {}
C(const C&) {++n;}
};
int main(int argc, char *argv[])
{
C c1(42);
C c2=42;
return n;
}
这条线“返回N”将返回0或1,这取决于复制是否被省略。
也考虑这个代码
#include <iostream>
struct C {
C() {}
C(const C&) { std::cout << "Hello World!\n"; }
};
void f() {
C c;
throw c; // copying the named object c into the exception object.
} // It is unclear whether this copy may be elided.
int main() {
try {
f();
}
catch(C c) {
}
}
它说, //复制异常对象到临时在异常声明。 //此副本是否可能被取消也不清楚。 所以我的问题是实现这种优化方法有多么有用,如果有时结果是不确定的?一般来说它的使用频率如何?
在第一个例子中甚至没有副本。对于第二个示例:http://stackoverflow.com/q/7401521/46642 –
@ R.MartinhoFernandes:在这个问题的第二个例子(而不是你的链接问题)中,与NRVO发生的警告相同:从'如果编译器可以保证在构造对象'c'时抛出异常,那么只有在异常的内部存储器才能被删除。即使在那里,根据我的理解,用户所具有的问题是标准没有强制规定这种行为,这意味着您不能依赖复制构造函数的副作用 - 这是标准明确指出的 –