web-dev-qa-db-ja.com

C ++のsizeofはコンパイル時または実行時に評価されますか?

たとえば、このコードスニペットの結果は、コンパイラマシンまたはマシン実行可能ファイルが機能するマシンによって異なります。

sizeof(short int)
59
ogzylz

sizeofはコンパイル時の演算子です。

59
Billy ONeal

プログラムを実行するマシンによって異なります。ただし、値はコンパイル時に評価されます。したがって、コンパイラーは(もちろん)コンパイルするマシンを認識している必要があります。

sizeofはコンパイル時に評価されますが、実行可能ファイルがコンパイル時とランタイムの値が異なるマシンに移動された場合、実行可能ファイルは無効になります。

6
anon

C99以降、オペランドが可変長配列である場合に限り、sizeofが実行時に評価されます。 int a [b]、ここでbはコンパイル時には不明です。この場合、sizeof(a)は実行時に評価され、その結果は配列全体のサイズ(バイト単位)、つまり配列内のすべての要素のサイズの合計になります。配列の要素数を取得するには、sizeof(a) / sizeof(b)を使用します。 C99標準から:

Sizeof演算子は、そのオペランドのサイズ(バイト単位)を生成します。これは、式または型の括弧で囲まれた名前の場合があります。サイズは、オペランドのタイプから決定されます。結果は整数です。オペランドのタイプが可変長配列タイプの場合、オペランドが評価されます。そうでない場合、オペランドは評価されず、結果は整数定数になります。

これらすべてが、ヒープに配列を割り当てた場合に得られるものとは異なることに注意してください。 int* a = new int[b]。その場合、sizeof(a)は、配列内の要素の数に関係なく、intへのポインターのサイズ、つまり4または8バイトを提供します。

5
Todor K.