2016-09-01 37 views
0

考慮優化行爲,並與

bool Fun1() 
{ 
... 
} 
bool Fun2() 
{ 
} 

而且某處主代碼我可以有

if(Fun1() && Fun2()) //option-1 
{ 
} 

if(Fun1() & Fun2()) //option-2 
{ 
} 

這似乎與VS2012,與option-1這是不確保這兩個功能總是在上發生。特別是如果其中一個函數返回false,則其他函數不會執行option-1。然而,整體代碼要求他們都評估正確的行爲,我可以通過option-2來實現。我想知道option-2的這種行爲是否可以從編譯器更改爲編譯器(也包含優化級別),還是由標準保證?

+0

我想我可以這樣說:由於'&&'和比較運算符要求雙方都是正確的,那麼如果第一面是假的,它不需要評估第二面。而'&'Bit-wise並且需要雙方在應用之前進行評估。 –

+2

option2的行爲不會改變,但有一些怪癖。主要是如何在工具集中定義bool。儘管如此,「&」將始終評估兩個結果。 –

+0

@Tomasz Plaskota這就是我所擔心的。優化器是否有可能理解函數的返回值是'bool',因此在技術上不需要評估它們中的一個是否爲假。 – user6386155

回答

0

如果你想運行這兩個函數,你可以使用選項2,但沒有必要調用這兩個函數,你可以使用選項1。

行爲 選項-1和選項-2的行爲不依賴編譯器。

性能選項-1的性能比更好的選擇-2

5

標準明確地說,對於內置類型,如bool運營商&&||短路 - 即第一個參數進行評估第一個和第二個參數僅在第一個參數沒有給出明確答案的情況下進行評估 - 也就是false對於||true對於&&

按位比較&遵循正常的函數調用規則,因此兩個參數都是按照未指定的順序進行評估的。

1

& &有短路的行爲,換句話說,如果第一個操作數爲假,第二個操作數不計算。 &沒有這種行爲,所以第二個總是肯定會被評估。但是,如果您正在處理布爾運算符,則始終使用& &而不是&,因爲&用於按位運算。對於您的問題,使用此代碼:

bool a = Fun1(); 
if(Fun2() && a){ 
    //Fun2 must be the left operand 
} 
2

Bitwise- &永遠確實評估兩個操作數。由於規則(如果規則),編譯器無法將其優化。但它是一個代碼異味來編程。想想那些會維護你的代碼的人。爲什麼有一個&而不是兩個?這是一個錯字嗎?等

我會至少拉評價出if語句。

bool fun12 = Fun1() & Fun2(); 
    if (fun12) { 
    . . . 

此外,您不能將此方法擴展到非bool函數。您必須先與0進行比較。

最後,&&評估第一個操作數和,然後(可選)第二個。未指定&中的評估順序(即隨機)。

0

這不是優化問題,而是語義問題。

& &如下短路評估規則和不能執行第二呼叫時,第一返回false。

&遵循普通評估和必須執行這兩個調用(除非它可以證明沒有副作用)。


無論如何,一個能想到的情況下爲& &表達一個編譯器會執行兩個參數在所有情況下評估(在沒有副作用),能夠充分利用並行。