簡體   English   中英

條件變量的惰性評估

[英]Lazy Evaluation on condition variables

在下面的代碼片段中,編譯器是否會對條件變量進行惰性求值並進行短路求值?

const bool condition1 = calcCondition1(...);
const bool condition2 = calcCondition2(...);
const bool condition3 = calcCondition3(...);

if (condition1 && condition2 && condition3)
  return true;
return false

這樣實際流程將類似於以下內容?

if(!calcCondition1(...))
  return false;
if(!calcCondition2(...))
  return false;
if(!calcCondition3(...))
  return false;
return true;

謝謝!

不,除非編譯器計算出來並優化它。 請注意,來自不同編譯單元(不同.cpp文件)的 function 主體是未知的:它們在編譯過程后鏈接成二進制文件。

編譯器必須假設最壞的情況,例如calcCondition1拋出異常或執行exit() 或者突變一些全局 state。 在這種情況下,必須保留語義,並且必須按書面順序調用所有內容

那個代碼

bool calcCondition1();
bool calcCondition2();
bool calcCondition3();

bool foo() {
    const bool condition1 = calcCondition1();
    const bool condition2 = calcCondition2();
    const bool condition3 = calcCondition3();

    if (condition1 && condition2 && condition3) return true;
    return false;
}

和示例程序集 output:

foo():                                # @foo()
        push    rbp
        push    rbx
        push    rax
        call    calcCondition1()@PLT
        mov     ebp, eax
        call    calcCondition2()@PLT
        mov     ebx, eax
        call    calcCondition3()@PLT
        and     bl, bpl
        and     al, bl
        add     rsp, 8
        pop     rbx
        pop     rbp
        ret

請注意,所有函數都被一一調用

如果編譯器確定不是這種情況(我使用的是gcc 擴展)

__attribute__((pure)) bool calcCondition1();
__attribute__((pure)) bool calcCondition2();
__attribute__((pure)) bool calcCondition3();

bool foo() {
    const bool condition1 = calcCondition1();
    const bool condition2 = calcCondition2();
    const bool condition3 = calcCondition3();

    if (condition1 && condition2 && condition3) return true;
    return false;
}

然后生成的代碼使用短路評估

foo():                                # @foo()
        push    rbx
        call    calcCondition1()@PLT
        test    al, al
        je      .LBB0_4
        call    calcCondition3()@PLT
        mov     ebx, eax
        call    calcCondition2()@PLT
        test    bl, bl
        je      .LBB0_4
        mov     ecx, eax
        mov     al, 1
        test    cl, cl
        je      .LBB0_4
        pop     rbx
        ret
.LBB0_4:
        xor     eax, eax
        pop     rbx
        ret

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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