2015-12-14 44 views
-1

我只是好奇的這兩行代碼是否不同:我是否正確解釋Visual Studio程序集輸出?

bool done = false; 
bool done(false); 

看來,第二是快如我們所說的默認構造函數的第一種情況,然後分配值。而在第二個我們只調用構造函數。

(也許這應該是自己的問題?)

我被困在一個斷點,並看看在彙編輸出兩條線路。他們是完全一樣的:

bool done = false; 
00F66E7D mov   byte ptr [done],0 

我說得對不對的,因此得出的結論是兩條線是相同的,或者,至少編譯器優化其中之一嗎?

這是正確的工作方式嗎?

+1

標量類型沒有構造函數。 –

+0

@KerrekSB啊,好吧。由於語法與第2行構造函數的語法相匹配,我理解它就是這樣。猜猜並非如此! – Greeny

回答

2
bool done = false; 
bool done(false); 

看來,第二是快如我們所說的默認構造函數的第一種情況,然後分配值。而在第二個我們只調用構造函數。

號在第一種情況下,你在技術上創建一個臨時bool價值和使用的一個副本初始化done。但是,所有編譯器都會優化複製並直接初始化done。它不是默認初始化的。

在第二種情況下,您使用的是done的直接初始化。沒有創建副本。

當然,對於bool值,這沒有什麼區別。

對於某些class類型,您將看到的唯一區別是如果禁用複製(使用= delete),則第一個版本將不會編譯(即使允許編譯器也優化類對象的任何副本)。如果編譯,結果代碼將是相同的。

2

bool是C++中的一個基本整型。它沒有構造函數,線條完全相同。由於操作是零的簡單分配,所以也不需要優化。

+0

啊,好吧。如果我們用用戶定義的類型替換bool,那麼怎麼樣?第1行比第2行慢嗎?另外,關於彙編程序輸出,這是查看動作A比動作B更快還是更慢的正確方法? – Greeny