FWIW,下面的代碼
inline unsigned int f1(const unsigned int i, const bool b) {return b ? i : 0;}
inline unsigned int f2(const unsigned int i, const bool b) {return b*i;}
int main()
{
volatile unsigned int i = f1(42, true);
volatile unsigned int j = f2(42, true);
}
用gcc編譯-02生產該組件:
.file "test.cpp"
.def ___main; .scl 2; .type 32; .endef
.section .text.startup,"x"
.p2align 2,,3
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB2:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
call ___main
movl $42, 8(%esp) // i
movl $42, 12(%esp) // j
xorl %eax, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE2:
沒有多少留下任何f1
或f2
的,因爲你可以看到。
就C++標準而言,只要不改變可觀察行爲(就好像規則),編譯器就可以對優化做任何事情。
您無法知道「編譯器」將如何使用表達式(在編譯時間已知參數的情況下)執行哪些操作,而無需指定哪種編譯器,但可能會優化兩者。一種方法可以告訴,用編譯時間已知的參數進行編譯並檢查輸出。 –
查看生成的彙編代碼 – James
FWIW,MSVC爲第一種情況生成一個掩碼並添加,第二個爲一個乘法,在我阻止它使用布爾值本身的評估操作的情況下(如果可以的話,它爲了進一步優化將改變生產布爾的測試)。從本質上講,無論是哪種情況,MSVC都是無分支的,在天真的情況下似乎更加優化。 – JasonD