[英]C++ Optimizing If Statements
請考慮以下聲明:
C a, b; //C contains c1, c2 and c3 all integers
if(a.c1==b.c1 && a.c2 == b.c2) {
a.c3=b.c3;
}
此聲明是否會針對以下內容進行優化:
if(a.c1 == b.c1) {
if(a.c2 == b.c2) {
a.c3=b.c3;
}
}
AFAIK,C ++編譯器不執行此類操作,因為它可能有副作用。 但這些都是內置類型。
是。 以下代碼段:
C a, b; //C contains c1, c2 and c3 all integers
if(a.c1==b.c1 && a.c2 == b.c2)
{
a.c3=b.c3;
}
將被“優化”到這個(或類似的東西):
if(a.c1 == b.c1)
{
if(a.c2 == b.c2)
{
a.c3=b.c3
}
}
這不是因為優化,而是因為C ++標准需要 短路評估 。 因此,合理的符合標准的C ++編譯器應該能夠使其短路。
C ++標准中沒有一個地方明確聲明某些布爾運算符是短路的。 這是從規則暗示:
ISO / IEC C ++標准14882§5.14邏輯AND運算符[expr.log.and]
logical-and-expression: inclusive-or-expression logical-and-expression && inclusive-or-expression
&&
運算符從左到右分組。 操作數都隱式轉換為bool
類型(第4節)。 其結果是true
,如果兩個操作數都是true
和false
,否則。 與&
不同,&&
保證從左到右的評估:如果第一個操作數為false
則不評估第二個操作數。
||
的規則類似 運營商:
ISO / IEC C ++標准14882§5.15邏輯OR運算符[expr.log.or]
logical-or-expression: logical-and-expression logical-or-expression || logical-and-expression
||
操作員組從左到右。 操作數都隱式轉換為bool
(第4節)。 如果其任一操作數為true
,則返回true
否則返回false
。 與|
不同 ,||
保證從左到右的評估; 此外,如果第一個操作數的計算結果為true
則不計算第二個操作數。
有條件的?
運營商:
ISO / IEC C ++標准14882§5.16條件運算符[expr.cond] conditional-expression:logical-or-expression logical-or-expression? 表達式:賦值表達式
- 條件表達式從右到左分組。 第一個表達式隱式轉換為
bool
(第4節)。 它被評估,並且如果它是true
,條件表達式的結果是所述第二表達式的值,否則,所述第三表達的。 除了臨時破壞(12.2)之外,第一個表達式的所有副作用都發生在評估第二個或第三個表達之前。 僅評估第二和第三表達式中的一個。
標准5.14 / 1:
&&運算符從左到右分組。 操作數都隱式轉換為bool類型(第4節)。 如果兩個操作數都為真,則結果為true,否則為false。 與&不同,&&保證從左到右的評估: 如果第一個操作數為假,則不評估第二個操作數。
C ++使用襯衫電路評估 。 因此,在某種程度上它將以這種方式工作。
我實際上並沒有以這種方式評估和優化代碼,但它將在匯編代碼中進行評估。
&&運算符是短路的。 換句話說,如果a.c1 == b.c1無法評估為true,則甚至不會評估a.c2 == b.c2。
它類似於您描述的解決方案,但它是C ++語言的一部分(並且比顯式鍵入嵌套的if語句更容易閱讀)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.