Cでsizeof(struct)の値を計算する方法


ベストアンサー

正確なシーケンス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よりも高いアドレスにある必要があります。同様に、cbよりも高いアドレスにある必要があります。

その結果、この特定の構造が占める可能性がありますそのアーキテクチャの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。それが目的です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です