调用构造函数的次数是多少?

时间:2013-04-17 15:02:24

标签: c++ copy-constructor compiler-optimization

我是C ++编程的初学者,我对C ++类构造函数有一个简单的问题。 为以下代码片段调用构造函数的次数?

std::string s = std::string("hello world");

我想这是两个,对吗?第一个是string(const char * s),第二个是string(const string& s)。如果我错了,请纠正我。

接下来的问题是,如果我在发布模式下编译代码,编译器会自动对其进行优化吗?例如将其视为std::string s("hello world");不同的编译器是否表现不同?

2 个答案:

答案 0 :(得分:4)

源类型与目标类型相同的复制初始化(使用=)的行为与直接初始化非常相似。因此初始化等同于:

std::string s(std::string("hello world"));

如果没有优化,将按照您的描述调用两个构造函数。在C ++ 11中,第二步(定义为string(string&&))首选移动构造函数,因为std::string("hello world")是一个右值表达式。但是,该标准明确允许在某些情况下省略复制/移动,包括这一点:

  

当一个未绑定到引用(12.2)的临时类对象被复制/移动到具有相同cv-nonqualified类型的类对象时,可以通过直接构造临时对象来省略复制/移动操作进入省略的复制/移动目标

因此,编译器可以选择优化副本。请注意,即使复制构造函数有一些奇怪的副作用,编译器也可能会这样做。也就是说,完全定义良好且有效的C ++程序可能具有多个可能的执行路径。一般来说,你想避免这种情况。

答案 1 :(得分:3)

您的代码有资格获得版权省略,因此大多数理智的编译器总是将其视为std::string s("hello world");,除非明确指示不这样做。