如果您有布爾值b
和int i
,那麼這兩個示例中的哪一個更好?基於布爾C++確定數值的最快方法
int x = i-1;
if(!b)x--;
或
int x;
if(b)x = i-1;else x = i-2;
在這兩個例子中,如果b
是真的x
是i-1
,否則x
是i-2
。如果您宣佈x
爲i-1
,並且如果b
錯誤或者您應該使用第二個示例,則應該遞減?
如果您有布爾值b
和int i
,那麼這兩個示例中的哪一個更好?基於布爾C++確定數值的最快方法
int x = i-1;
if(!b)x--;
或
int x;
if(b)x = i-1;else x = i-2;
在這兩個例子中,如果b
是真的x
是i-1
,否則x
是i-2
。如果您宣佈x
爲i-1
,並且如果b
錯誤或者您應該使用第二個示例,則應該遞減?
如果編譯器沒有將兩個版本都優化到相同的最佳程序集,我會感到驚訝。除非您可以使用探查器證明它們的重要性,否則不要浪費時間進行這種微觀優化。
要回答你的問題:這是無關緊要的。以下是gcc.godbolt.org與-Ofast
的「生成裝配」比較。
volatile int state0;
volatile void f0(volatile int i, volatile bool b)
{
int x;
if(b)x = i-1;else x = i-2;
state0 = x;
}
...被編譯到...
f0(int, bool): # @f0(int, bool)
mov dword ptr [rsp - 4], edi
mov byte ptr [rsp - 5], sil
movzx eax, byte ptr [rsp - 5]
or eax, -2
add eax, dword ptr [rsp - 4]
mov dword ptr [rip + state0], eax
ret
volatile int state1;
volatile void f1(volatile int i, volatile bool b)
{
int x = i-1;
if(!b)x--;
state1 = x;
}
...被編譯到...
f1(int, bool): # @f1(int, bool)
mov dword ptr [rsp - 4], edi
mov byte ptr [rsp - 5], sil
mov eax, dword ptr [rsp - 4]
movzx ecx, byte ptr [rsp - 5]
or ecx, -2
add ecx, eax
mov dword ptr [rip + state1], ecx
ret
正如您所看到的,差異很小,而且通過刪除volatile
,允許編譯器更積極地進行優化時,極有可能會消失。
這裏有一個類似的比較以圖片形式,使用-Ofast -march=native -ffast-math
:
無分支版本是'x = i-2 + b;' –
如果你在發行版中編譯,編譯器會輸出相同的代碼 – user
爲什麼你要問?微觀優化是無關緊要的。 –