首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么不调用复制构造函数

为什么不调用复制构造函数
EN

Stack Overflow用户
提问于 2013-01-04 17:21:17
回答 3查看 780关注 0票数 20

可能重复:

What are copy elision and return value optimization?

我很难理解为什么在下面的代码中没有调用复制构造函数。

代码语言:javascript
复制
#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;
}

有人能解释一下为什么只调用构造函数而不调用复制构造函数吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-04 17:22:47

这被称为复制省略

允许编译器执行此优化。尽管该标准不能保证这一点,但任何商业编译器都会尽可能地执行这种优化。

标准参考

C++03 12.8.15:

...这种复制操作的省略在以下情况下是允许的(可以组合在一起以消除多个副本):

..。

  • 当尚未绑定到引用(12.2)的临时类对象将被复制到具有相同cv-类型的类对象时,可以通过将临时对象直接构造到省略的copy的目标中来省略复制操作

您可以使用一些编译器设置来禁用此优化,就像在中使用gcc一样

代码语言:javascript
复制
-fno-elide-constructor

C++标准允许实现省略创建仅用于初始化相同类型的另一个对象的临时。指定此选项将禁用该优化,并强制G++在所有情况下调用复制构造函数。

但是,使用这种方法会使代码在不同的编译器之间不可移植。

票数 25
EN

Stack Overflow用户

发布于 2013-01-04 17:23:00

这是因为您的编译器执行了优化。编译器被允许执行这样的优化,尽管这不是必需的,因此不能保证

请注意,重要的一点是,即使复制构造函数最终不会被调用,它在语义上也要求是可访问的。也就是说,如果您将复制构造函数设为编译,您的代码将不会编译!!( private!!)这是因为语义检查是在优化阶段之前完成的,这意味着编译器首先检查复制构造函数是否可访问;如果是,则只会进入优化阶段,其中复制构造将被省略。

票数 11
EN

Stack Overflow用户

发布于 2013-01-04 17:41:45

正如其他人已经很好地提到的,这是由于编译器的优化。

我还没有检查过它,但是你可以用优化编译你的代码,也可以不用优化编译你的代码,然后看看汇编代码。那么你也应该明确看到一些不同之处。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14154290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档