在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