まともなコンパイラは確かにその最適化を行うべきであり、GCCはそうします。次のソース:
#include <cstdio>
inline void foo(bool maybe)
{
if (maybe) {
printf("Maybe\n");
}
printf("Always\n");
}
int main()
{
foo(true);
foo(false);
}
(最適化を使用して-O3
)コンパイルして次のようにします。
0000000000400410 <main>:
400410: 48 83 ec 08 sub $0x8,%rsp
400414: bf e4 05 40 00 mov $0x4005e4,%edi
400419: e8 d2 ff ff ff callq 4003f0 <puts@plt>
40041e: bf ea 05 40 00 mov $0x4005ea,%edi
400423: e8 c8 ff ff ff callq 4003f0 <puts@plt>
400428: bf ea 05 40 00 mov $0x4005ea,%edi
40042d: e8 be ff ff ff callq 4003f0 <puts@plt>
400432: 31 c0 xor %eax,%eax
400434: 48 83 c4 08 add $0x8,%rsp
400438: c3 retq
400439: 0f 1f 00 nopl (%rax)
puts
無条件に3回呼び出す。