應該如何初始化函數中的局部變量?出於性能原因,我應該這樣做嗎?函數中的局部變量應該如何初始化?
Point2D point(1,2);
還是這樣?
Point2D point = Point2D(1,2);
它甚至有問題嗎?
應該如何初始化函數中的局部變量?出於性能原因,我應該這樣做嗎?函數中的局部變量應該如何初始化?
Point2D point(1,2);
還是這樣?
Point2D point = Point2D(1,2);
它甚至有問題嗎?
不,沒關係。兩者都會導致對相同構造函數的調用。
第一個只調用構造函數,而第二個只調用構造函數,然後將其複製到point
。因此,您應該使用第一個,因爲它不啓動複製操作。
是的,它確實很重要。第一個版本Point2D point(1,2)
將調用構造函數,而第二個Point2D point = Point2D(1,2)
將首先創建一個新的Point2D
(右邊一個),然後調用複製構造函數實際創建point
。如您所見,這是C++和Java或C#之間的巨大差異。
大多數時候,返回值的優化將會使這兩個選項從性能的角度(特別是如果你有定義的舉動,賦值運算符)
還有其他的事情要考慮,雖然非常相似。
如果你的類型有一個空的構造,這樣做是有問題的:
Point2D p(); // instead of Point p;
這就是所謂的Most Vexing Parse。
Point2D p = Point2D();
,或者使用最新標準引入統一初始化語法:
Point2D p{};
不第二調用拷貝構造函數,可以通過使用第二種形式來避免? –
@Paul:它可以,但大多數編譯器不會啓用優化(另請參閱'copy elision')。這基本上是_direct-initialization_和_copy-initialization_之間的區別。 – ildjarn
@ildjarn編譯器用代碼解決問題的事實是不言而喻的。如果沒有進行優化,第二個版本可能會比第一個版本慢兩倍,當然不會以任何方式使用C++ ish。 :) –