6 c++ performance integer if-statement boolean
如果你有一个布尔值b和一个int i,那两个例子中哪一个更好?
int x = i-1;
if(!b)x--;
Run Code Online (Sandbox Code Playgroud)
要么
int x;
if(b)x = i-1;else x = i-2;
Run Code Online (Sandbox Code Playgroud)
在这两个例子中,如果b是真实x的i-1,否则x是i-2.如果你申报x的i-1,如果和递减b是假的,或者您应该使用第二个例子吗?
Vit*_*meo 10
如果编译器没有将两个版本优化到相同的最佳装配,我会感到惊讶.除非您可以使用分析器证明它们很重要,否则不要浪费您的时间进行微观优化.
回答你的问题:这是无关紧要的.这里有一个"生成汇编"比较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;
}
Run Code Online (Sandbox Code Playgroud)
...被编译为......
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
Run Code Online (Sandbox Code Playgroud)
volatile int state1;
volatile void f1(volatile int i, volatile bool b)
{
int x = i-1;
if(!b)x--;
state1 = x;
}
Run Code Online (Sandbox Code Playgroud)
...被编译为......
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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,差异很小,当允许编译器通过删除进行更积极的优化时,极有可能消失volatile.
以下是图片形式的类似比较,使用-Ofast -march=native -ffast-math:
检查汇编代码,因为优化器会优化,可能是同一解决方案的解决方案.
我可能会将它实现为:
int x = (b) ? i - 1 : i - 2;
Run Code Online (Sandbox Code Playgroud)
为了便于阅读,优化程序可能会将其作为您的第二个解决方案.
| 归档时间: |
|
| 查看次数: |
219 次 |
| 最近记录: |