このフォーラムやsizeof演算子に関連する他の質問はすでにいくつかありますが、コンパイラがsizeof演算子を評価して、データ型、変数、ポインタ、配列などのサイズを見つける方法については、答えを得ることができませんでした。これを詳細に理解するのに役立ついくつかのリンクへ。どんな助けでも大歓迎です。ありがとう。
4 に答える
コンパイラは、プリミティブデータ型のサイズを知っているだけです。この知識は基本的にコンパイラに組み込まれています。
従来の固定サイズの配列と複雑なデータ型(構造体とクラス)の場合、構成プリミティブのサイズを合計し、必要なパディングを考慮します。http://en.wikipedia.org/wiki/Data_structure_alignmentを参照してください
ほとんどのsizeof()
場合、計算はコンパイル時に行われます。例外は可変長配列(C99の新機能)の場合で、要素の数がわかれば実行時に計算されます。
サイズ情報は、コンパイラが内部に持っている情報から取得されます。
コンパイラは、、、、およびポインタなどの基本型のサイズを認識しています。これらはコンパイラに組み込まれているためchar
です。int
double
コンパイラーは、構造内のメンバーを含むすべての部分のサイズ、整列に使用されるパディング、および言語機能をサポートする非表示の部分(ポリモーフィズムをサポートするクラス情報へのポインターなど)を追加することにより、複合構造のサイズを計算します。 。
コンパイラーは、要素の数に各要素のサイズを掛けて、配列のサイズを計算します。
char
定義上、サイズは1です。必ずしも8ビットである必要はありませんが、常に1バイトであることに注意してください。
プリミティブ型とポインターはそれぞれ、コンパイラーが認識している固定サイズです。これらは、コンパイラとプラットフォームによって異なる場合があります。
配列は、要素タイプのサイズに要素数を掛けて計算されます。
Cの構造体、およびC ++のクラスは、少なくとも非静的データメンバーの合計と同じ大きさです。メンバーを正しく配置するために、これらは大きくなる場合があります。また、C ++では、ポリモーフィズムをサポートするために、アクセスできない余分なデータメンバーが存在する場合があります。
ソースコードで宣言された変数のサイズは、配列、構造体などであるかどうかをプログラムに常に認識しています。ただし、ほとんどのデータ型には、それらを定義する固定サイズがあります。異なるデータ型がある理由は、異なるサイズのデータ型が必要なためです。charは、1バイトに収まる任意の文字です。この例では、0〜9の数字しか表すことができません。つまり、16桁の長さの数値があるとしましょう。文字しかない場合、コンピューターがその数値を表すのに16バイトかかります。8桁の長さの数値(バイト)を想像してみてください。この数値は、8桁のそれぞれに2つの可能な値(0または1)しか持てません。64の可能な一意の組み合わせしか持てません。ここで、これら64の組み合わせのすべてが特定の数を表していると想像してください。ほとんどの場合、16バイト未満の16桁の長さの数値を正しくすることができます。これがintデータ型の背後にある考え方です。intとcharsの説明を簡略化して、深く理解しなくても説明できるようにしたことに注意してください。今、私はあなたが配列についてどう思っているか知っていますか?
for (i = 0; array[i] != NULL; i++) {}
上記のコードは基本的に関数strlen()が行うことです。配列がNULL文字で終了する理由を疑問に思ったことはありませんか?これは、上記のコードと同じくらい簡単に配列の長さを見つけることができるためです。したがって、質問に答えるために、sizeof()は、値がすでにわかっているものをすべて計算します。