定数を追加する次の単純な関数を考えてみましょう。
unsigned char f(unsigned char x) {
return x + 5;
}
これにより、次のアセンブリが生成されます ( -O3
gcc 4.7.2 で)。
leal 5(%rdi), %eax
ret
符号なしオーバーフローは C では明確に定義された動作であるため、モジュロ演算を追加することは基本的に nop であると想定できます。
unsigned char f(unsigned char x) {
return (x + 5) % 256; // assume char is 8-bits, which is typical
}
ただし、生成されたアセンブリには追加の命令があります。
leal 5(%rdi), %eax
movzbl %al, %eax
ret
誰かが私になぜこれがそうなのか教えてもらえますか? 組み立てにはあまり詳しくありませんが、
(注: これは、GCC がコードを最適化する方法を理解するために私が作成したおもちゃの問題です。)