1

次のコードがあります。

シナリオ 1

/* get count of elements in an array */
#define COUNT(x)         sizeof(x)/sizeof(x[0])

struct Data data[] = {/* some data goes here */};

int count = COUNT(data);

シナリオ 2

#define TOTAL            32
#define EACH              4
int count = (TOTAL/EACH)

マクロは前処理中に解決され、 sizeof はコンパイル時の演算子であることは知っていますが、除算はどうですか: コンパイル中に最適化されますか?

コンパイラによる最適化を確認するツールはありますか?

4

1 に答える 1

4

通常、生成されたアセンブリ コードをコンパイラに表示させることができます。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既にスワップされた値に置き換えられました。

于 2013-08-01T11:36:55.207 に答える