在C++中初始化对象(类或结构的实例)可以通过多种方式完成。有些语法会引起对象的直接初始化,其他语法会导致复制初始化。在编译器中启用了copy-elision,两者的性能相同。如果copy-elision已禁用,则在为后者(复制初始化)选择时,每个实例化都会有一个额外的复制/移动构造函数调用。它是直接初始化还是复制初始化?
结论:复制初始化可能会有性能损失!
从以下问题:C++11 member initializer list vs in-class initializer?我可以断定,这将是副本初始化语法:
obj s = obj("value");
,这将是直接初始化语法:
obj s{"value"};
但是这个怎么样:
obj s = {"value"};
这一个:
obj s = obj{"value"};
这一个:
obj s("value");
或者这一个:
obj s = "value";
注意
了Bjarne Stroustrup的在他的著作 “编程,原理与实践使用C++” 第二版,比较少数的初始化样式(但不是全部)311页,§9.4.2:
struct Date { int y,m,d; //year, month, day Date(int y, int m, int d); //check for valid date and initialize void add_day(int n); //increase the Date by n days };
...
Date my_birthday; //error: my_birthday not initialized Date today{12,24,2007}; //oops! run-time error Date last{2000,12,31}; //OK (colloquial style) Date next = {2014,2,14}; //also OK (slightly verbose) Date christmas = Date{1976,12,24}; //also OK (verbose style)
斯特劳斯先生介绍了这些不同的初始化风格相等。至少,这就是它对我的看法。尽管如此,仍有可能有一些是直接初始化和其他复制初始化,因为这些条款尚未在书中讨论。
编辑
给出的答案带来了一些有趣的事情。
显然,这是直接初始化:
obj s("value");
这是直接列表初始化:
obj s{"value"};
你们有些人指出,是有区别的。他们实际上以何种方式不同?在非优化编译器的输出中,差异是否会显着?
有没有'='?是的:这是复制初始化。否则是直接初始化。 – Rakete1111
@ Rakete1111 [这似乎不是真的](http://coliru.stacked-crooked.com/a/18e4e0f6db8a9bfc)。 – nwp
@nwp当然,如果你使用大括号,它是* -list-initialization,取决于'='。对不起,谢谢! – Rakete1111