如果您具有 boolean b
和int i
,则两个示例中哪个更好?
int x = i-1;
if(!b)x--;
或者
int x;
if(b)x = i-1;else x = i-2;
在这两个示例中,如果
b
为true,x
为i-1
,否则x
为i-2
。您应该将x
声明为i-1
并在b
为false时递减还是应该使用第二个示例? 最佳答案
如果编译器没有将两个版本都优化为同一最佳程序集,我会感到惊讶。除非您可以使用分析器证明它们非常重要,否则不要浪费时间进行微优化。
要回答您的问题:没关系。这是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
的图片形式的类似比较: