如果您具有 boolean b和int i,则两个示例中哪个更好?

int x = i-1;
if(!b)x--;

或者
int x;
if(b)x = i-1;else x = i-2;

在这两个示例中,如果b为true,xi-1,否则xi-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的图片形式的类似比较:

c++ - 基于 boolean C++确定值的最快方法-LMLPHP

08-25 01:09