我有時讀到了當我調用構造函數時,它創建臨時對象,然後將其複製到真正的變量。所以我不應該把一些東西放到構造函數中,例如創建對象的計數器等,創建對象的一些語法應該比其他的更快?C++構造函數(速度)
A a(10);
A a = 10; // temporary object?
A a = A(10); // temporary object?
那麼我應該使用什麼類型的構造函數?
我有時讀到了當我調用構造函數時,它創建臨時對象,然後將其複製到真正的變量。所以我不應該把一些東西放到構造函數中,例如創建對象的計數器等,創建對象的一些語法應該比其他的更快?C++構造函數(速度)
A a(10);
A a = 10; // temporary object?
A a = A(10); // temporary object?
那麼我應該使用什麼類型的構造函數?
確實,編譯器原則上被允許生成一個臨時對象,當你說A a = 10;
或A a = A(10);
,但從來沒有當你說A a(10);
。但是,該標準明確允許省略這個不必要的副本,任何理智的編譯器都會執行此優化。
在GCC中,您可以禁止使用旗標-fno-elide-constructors
進行優化。
作爲一個正式的結果,不過,後兩種形式的初始化需要構造A::A(int)
不explicit
,而第一種形式(直接初始化)有明確的構造函數的作品,太。隱式轉換的概念有點微妙,值得記住。
在發佈模式下,它們沒有什麼區別,因爲編譯器這幾天足以優化臨時對象。儘管在調試模式下,它們可能會創建一個臨時對象,以允許調試器有一種附加到對象創建的方式。
如果您在發行版中編譯(使用優化標誌),那麼編譯器將刪除該副本(技術上稱爲elide副本)。 。 –
@ gongzhitaao,我可以給你代碼後者不編譯,但前者的確如此。 – chris