我过去雇佣的15年经验丰富的明星开发人员声称,复制CTOR创建对象优于赋值运算符。 因此,
Object x = Object(5, "My Object"); // is inefficient
Object y(5, "My Object"); // is efficient
但是,通过以下测试代码,我看到编译器始终为上面的第一行调用Copy CTOR。 如:
class test_ctor
{
public:
explicit
test_ctor(int x):_x(x)
{
std::cout << "CTOR: " << _x << "\n";
}
test_ctor & operator = (test_ctor const & y)
{
std::cout << "operator =: " << _x << "\n";
_x = y._x;
return *this;
}
private:
int _x;
};
int main(int argc, const char * argv[]) {
test_ctor const test = test_ctor(2);
return 0;
}
由于我的前雇主认为他是明星开发者,我想知道我错过了什么。是否有任何编译器会有不同的做法(想想MS Windows 7 / Visual Studio 2010+和OpenSuse 10+ OS /编译器)?
答案 0 :(得分:3)
首先,没有任务;他们都是初始化。所以这里不涉及assignmenet运算符。
Object x = Object(5, "My Object");
表示直接初始化临时Object
,然后使用它来复制初始化x
; Object y(5, "My Object");
表示直接初始化y
。所以后者更有效率;在概念中。
根据copy elision(因为C ++ 17保证),两种初始化样式实际上具有相同的效果;对象都是直接初始化的(省略了复制操作)。