[英]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.