可能重复:
What are copy elision and return value optimization?
我很难理解为什么在下面的代码中没有调用复制构造函数。
#include <iostream>
class Test
{
public:
Test(int){std::cout << "Test()" << std::endl;}
Test(const Test&){std::cout << "Test(const Test&)" << std::endl;}
};
int main()
{
// Test test;
Test test2(Test(3));
return 0;
}
有人能解释一下为什么只调用构造函数而不调用复制构造函数吗?
谢谢。
发布于 2013-01-04 17:22:47
这被称为复制省略。
允许编译器执行此优化。尽管该标准不能保证这一点,但任何商业编译器都会尽可能地执行这种优化。
标准参考:
C++03 12.8.15:
...这种复制操作的省略在以下情况下是允许的(可以组合在一起以消除多个副本):
..。
您可以使用一些编译器设置来禁用此优化,就像在中使用gcc一样
-fno-elide-constructor
C++标准允许实现省略创建仅用于初始化相同类型的另一个对象的临时。指定此选项将禁用该优化,并强制G++在所有情况下调用复制构造函数。
但是,使用这种方法会使代码在不同的编译器之间不可移植。
发布于 2013-01-04 17:23:00
这是因为您的编译器执行了优化。编译器被允许执行这样的优化,尽管这不是必需的,因此不能保证。
请注意,重要的一点是,即使复制构造函数最终不会被调用,它在语义上也要求是可访问的。也就是说,如果您将复制构造函数设为编译,您的代码将不会编译!!( private
!!)这是因为语义检查是在优化阶段之前完成的,这意味着编译器首先检查复制构造函数是否可访问;如果是,则只会进入优化阶段,其中复制构造将被省略。
发布于 2013-01-04 17:41:45
正如其他人已经很好地提到的,这是由于编译器的优化。
我还没有检查过它,但是你可以用优化编译你的代码,也可以不用优化编译你的代码,然后看看汇编代码。那么你也应该明确看到一些不同之处。
https://stackoverflow.com/questions/14154290
复制相似问题