gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:00 24 4
gpt4 key购买 nike

如果你有一个 boolean b 和一个 int i,这两个例子中哪个更好?

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

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

在这两个例子中,如果 b 为真,则 xi-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:

Godbolt comparison

关于c++ - 基于 boolean C++ 确定值的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41551174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com