复制elision方法
从copy elision方法的标准定义:在C ++计算机编程中,copy 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) {
}
}
它说//将异常对象复制到异常声明中的临时对象中。 //此副本是否可能会被删除也不清楚。 所以我的问题是如何实现这样的优化方法是多么有用,如果有时结果是不确定的?一般来说它的使用频率如何?
重要的是,标准明确允许这样做,这意味着你不能假定复制构造函数的副作用将被执行,因为副本可能会被忽略。 该标准要求复制构造函数的实现具有复制构造函数语义,也就是说,具有在您的域中与原始对象在语义上等同的第二个对象的生成的整体目的。 如果你的程序符合那个,那么优化不会影响程序。
另一方面,这是唯一的情况,我可以认为这个标准允许来自同一个程序的不同可见结果取决于编译器的作用,但是你已经被告知你不应该有副作用你的拷贝构造函数(或者说,你不能依赖于执行拷贝的确切数量)。
至于是否值得,是的。 在许多情况下,副本是相当昂贵的(我故意忽略C ++ 11中的移动构造函数)。 考虑一个返回一个vector<int>
的函数,如果不复制副本,则需要另一个动态分配,复制所有向量内容,然后释放原始内存块,所有这三个操作都可能很昂贵。
或者,您可以强制用户更改其代码以创建空对象并通过引用传递它,但这会使代码难以阅读。
链接地址: http://www.djcxy.com/p/72911.html上一篇: copy elision method