当前位置:  开发笔记 > 编程语言 > 正文

基于布尔c ++确定值的最快方法

如何解决《基于布尔c++确定值的最快方法》经验,为你挑选了2个好方法。

如果你有一个布尔值b和一个int i,那两个例子中哪一个更好?

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

要么

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

在这两个例子中,如果b是真实xi-1,否则xi-2.如果你申报xi-1,如果和递减b是假的,或者您应该使用第二个例子吗?



1> Vittorio Rom..:

如果编译器没有将两个版本优化到相同的最佳装配,我会感到惊讶.除非您可以使用分析器证明它们很重要,否则不要浪费您的时间进行微观优化.

回答你的问题:这是无关紧要的.这里有一个"生成汇编"比较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:

Godbolt比较



2> Michel Keijz..:

检查汇编代码,因为优化器会优化,可能是同一解决方案的解决方案.

我可能会将它实现为:

int x = (b) ? i - 1 : i - 2;

为了便于阅读,优化程序可能会将其作为您的第二个解决方案.


我会写`int x = i - b?1:2;"更不用说`i`两次了
推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有