通常、生成されたアセンブリ コードをコンパイラに表示させることができます。Visual C++ では、/Fa<file>
オプションでそれを行うことができます。gcc
オプションがあり-S
ます。
あなたの質問について: ほとんどのコンパイラは、少なくとも最適化レベルよりも高い定数式を事前計算する必要がありO0
ます。
シナリオの例を見てみましょう:
#define COUNT(x) sizeof(x)/sizeof(x[0])
int data[] = {1, 2, 3, 4, 5};
int count = COUNT(data);
cl /c /Fascenario1.asm scenario1.c
収量でコンパイル:
...
PUBLIC _data
PUBLIC _count
_DATA SEGMENT
_data DD 01H
DD 02H
DD 03H
DD 04H
DD 05H
_count DD 05H
_DATA ENDS
END
count
最後に近い値が表示されますが、実際には 5 です。したがって、最適化がオンになっていない場合でも、コンパイラは値を計算しました。
2 番目のシナリオ:
#define TOTAL 32
#define EACH 4
int count = (TOTAL/EACH);
収量
...
PUBLIC _count
_DATA SEGMENT
_count DD 08H
_DATA ENDS
END
式も事前に計算されています。
より高い最適化レベルでは、コンパイル時の定数を渡すときにコンパイラがより複雑な式を評価することさえ珍しくありません。例として、2 つの整数をスワップする 3 つの異なる方法のコードを調べたことがあります。コンパイラで最適化をオンにすると、swap メソッドの呼び出しが完全に破棄され、テストの引数がprintf
既にスワップされた値に置き換えられました。