以下のコードは同じアセンブラを生成している。
bool mod(size_t i) { return i % 4 == 0; } bool bitOr(size_t i) { return (i & 3) == 0; }
% dmd --version
DMD64 D Compiler v2.071.0
Copyright (c) 1999-2015 by Digital Mars written by Walter Bright
% dmd -main -g -O fuga.d
% objdump -drS fuga| less
...
0000000000422b70 <_D4fuga3modFmZb>:
bool mod(size_t i)
422b70: 50 push %rax
422b71: 48 89 3c 24 mov %rdi,(%rsp)
{
return i % 4 == 0;
422b75: f6 04 24 03 testb $0x3,(%rsp)
422b79: 0f 94 c0 sete %al
}
422b7c: 59 pop %rcx
422b7d: c3 retq
422b7e: 66 90 xchg %ax,%ax
0000000000422b80 <_D4fuga5bitOrFmZb>:
bool bitOr(size_t i)
422b80: 50 push %rax
422b81: 48 89 3c 24 mov %rdi,(%rsp)
{
return (i & 3) == 0;
422b85: f6 04 24 03 testb $0x3,(%rsp)
422b89: 0f 94 c0 sete %al
}
422b8c: 59 pop %rcx
422b8d: c3 retq
422b8e: 66 90 xchg %ax,%ax
ちょっと凝ったコードを書く前に「それコンパイラがやってくれてないか」というのを調べてみてもいいんじゃない?というだけのはなし。