簡體   English   中英

C ++優化語句

[英]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 ++編譯器不執行此類操作,因為它可能有副作用。 但這些都是內置類型。

  • 標准中有什么相關內容嗎?
  • 如果它是編譯器特定的主流編譯器(MS,GNU,Intel)正在做或不做?

是。 以下代碼段:

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 
  1. &&運算符從左到右分組。 操作數都隱式轉換為bool類型(第4節)。 其結果是true ,如果兩個操作數都是truefalse ,否則。 &不同, &&保證從左到右的評估:如果第一個操作數為false則不評估第二個操作數。

||的規則類似 運營商:

ISO / IEC C ++標准14882§5.15邏輯OR運算符[expr.log.or]

 logical-or-expression: logical-and-expression logical-or-expression || logical-and-expression 
  1. || 操作員組從左到右。 操作數都隱式轉換為bool (第4節)。 如果其任一操作數為true ,則返回true否則返回false |不同 || 保證從左到右的評估; 此外,如果第一個操作數的計算結果為true則不計算第二個操作數。

有條件的? 運營商:

ISO / IEC C ++標准14882§5.16條件運算符[expr.cond] conditional-expression:logical-or-expression logical-or-expression? 表達式:賦值表達式

  1. 條件表達式從右到左分組。 第一個表達式隱式轉換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM