2013-04-02 143 views
0

我有時讀到了當我調用構造函數時,它創建臨時對象,然後將其複製到真正的變量。所以我不應該把一些東西放到構造函數中,例如創建對象的計數器等,創建對象的一些語法應該比其他的更快?C++構造函數(速度)

A a(10); 
A a = 10; // temporary object? 
A a = A(10); // temporary object? 

那麼我應該使用什麼類型的構造函數?

+3

如果您在發行版中編譯(使用優化標誌),那麼編譯器將刪除該副本(技術上稱爲elide副本)。 。 –

+0

@ gongzhitaao,我可以給你代碼後者不編譯,但前者的確如此。 – chris

回答

8

確實,編譯器原則上被允許生成一個臨時對象,當你說A a = 10;A a = A(10);,但從來沒有當你說A a(10);。但是,該標準明確允許省略這個不必要的副本,任何理智的編譯器都會執行此優化。

在GCC中,您可以禁止使用旗標-fno-elide-constructors進行優化。


作爲一個正式的結果,不過,後兩種形式的初始化需要構造A::A(int)explicit,而第一種形式(直接初始化)有明確的構造函數的作品,太。隱式轉換的概念有點微妙,值得記住。

1

在發佈模式下,它們沒有什麼區別,因爲編譯器這幾天足以優化臨時對象。儘管在調試模式下,它們可能會創建一個臨時對象,以允許調試器有一種附加到對象創建的方式。