ベストアンサー
正確なシーケンスsizeof(struct)
はコンパイルエラーですCで。特定の struct
のサイズをどのように決定するかを尋ねていると思います。
その答えは、C言語の定義によって直接提供されるではありません。むしろ、それは特定のターゲットアーキテクチャに対するABIの機能です。 (ABIはApplication Binary Interfaceの略です。)
C言語標準では、いくつかの広範なルールが規定されています。たとえば、struct
に複数のメンバーがいる場合、最初のメンバーはstruct
自体とアドレスを共有し、後続のメンバーは
ビットフィールドには独自のルールセットがあります。ここでは要約しません。
最初の注文では、struct
のサイズはになります。少なくともそのメンバーのサイズの合計と同じ大きさです(現時点ではビットフィールドを無視します)。メンバーには配置の制約がある場合があり、その場合、環境によってメンバー間にパディングが導入され、struct
の最後にパディングが導入される可能性があります。
次のivを検討してください。 double
値に8バイトのアラインメントが必要なアーキテクチャのid = “a3303ac3a0″>
:
struct fun {
char a;
double b;
char c;
};
C言語の規則により、b
は、struct fun
のどのインスタンスでも、a
よりも高いアドレスにある必要があります。同様に、c
はb
よりも高いアドレスにある必要があります。
その結果、この特定の構造が占める可能性がありますそのアーキテクチャのb
の配置制約のため、24バイト。 double
に4バイトのアラインメントしか必要としないアーキテクチャでは同じ構造体で16バイトしか必要ない場合があります。
信じられませんか?
自分の目で確かめてください:
最終的には、ターゲットプラットフォームのABIを調べて、はそのターゲット用にまとめられます。
または、sizeof
個人的には気にしないが、コードは気にする必要がある場合。
回答
計算方法Cのsizeof(struct)の値は?
そうではありません。コンパイラはそうします。
まず、sizeof(struct)
は構文エラーです。おそらく、構造タイプまたはそのようなタイプのオブジェクトのサイズを決定する方法を尋ねているでしょう。正確であることが重要です。 (Quoraが質問の詳細を削除すると、それが難しくなることを理解しています。)
struct foo
という名前の構造タイプおよび/またはそのタイプのオブジェクトがあるとします。 obj
。タイプのサイズはsizeof (struct foo)
であり、オブジェクトのサイズ(タイプのサイズと同じ)はsizeof foo
です。 。 (最初のケースでは括弧が必要であり、2番目のケースでは必要ありません。実際にはsizeof
演算子には2つの異なる形式があります。1つは括弧で囲まれた型名に適用され、もう1つは式。これは、常にではありませんが、多くの場合、オブジェクト名です。)
構造体のメンバーのサイズを合計することで、構造体のサイズを計算できると考えているかもしれません。できません。コンパイラーは、整列要件を満たすために、メンバー間、場合によっては最後のメンバーの後にパディングを挿入できます。構造体のサイズは、少なくともそのメンバーのサイズの合計であるですが、構造体全体のサイズが必要な場合は、sizeof
。それが目的です。