Vajon melyik megoldás a gyorsabb ha 32 bites integerekkel számolunk:
- result = (!a);
- result = (a == 0)
A választ disasm után kaphatjuk meg:
1.
005F775E xor eax,eax
005F7760 cmp dword ptr [ebp-18h],0
005F7764 sete al
005F7767 mov dword ptr [ebp-24h],eax
2.
005F7781 xor eax,eax
005F7783 cmp dword ptr [ebp-18h],0
005F7787 sete al
005F778A mov dword ptr [ebp-30h],eax
Vagyis MSVC++-szal fordítva, mindkét kód ugyanazt hajtja végre.
Most pedig nézzük ezt az esetet másképp:
- if( !i ) { ... }
- if( i==0 ) { ... }
1.
005F7747 cmp dword ptr [ebp-18h],0
005F774B jne main+54h (5F7754h)
2.
005F7754 cmp dword ptr [ebp-18h],0
Vagyis a két változat most is megegyezik.
005F7758 jne main+61h (5F7761h)
Utoljára nézzük az utóbbi eset ellentétét:
- if( i) { ... }
- if( i>0 ) { ... }
1.
0044D4E1 cmp dword ptr [ebp-18h],0
0044D4E5 je main+5Eh (44D4EEh)
2.
0044D4EE cmp dword ptr [ebp-18h],0
0044D4F2 jle main+6Bh (44D4FBh)
Az összes eset ugyanarra a kódra fordul vagyis nem érdemes trükközni.