如果你有一个布尔值b
和一个int i
,那两个例子中哪一个更好?
int x = i-1; if(!b)x--;
要么
int x; if(b)x = i-1;else x = i-2;
在这两个例子中,如果b
是真实x
的i-1
,否则x
是i-2
.如果你申报x
的i-1
,如果和递减b
是假的,或者您应该使用第二个例子吗?
如果编译器没有将两个版本优化到相同的最佳装配,我会感到惊讶.除非您可以使用分析器证明它们很重要,否则不要浪费您的时间进行微观优化.
回答你的问题:这是无关紧要的.这里有一个"生成汇编"比较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
:
检查汇编代码,因为优化器会优化,可能是同一解决方案的解决方案.
我可能会将它实现为:
int x = (b) ? i - 1 : i - 2;
为了便于阅读,优化程序可能会将其作为您的第二个解决方案.