私の質問は構造体の埋め込みに関するものですか?構造体のパディングの背後にあるロジックを教えてください。構造体の埋め込みはどのように機能しますか?
例:
構造ノード{ char c1;
short s1;
char c2;
int i1;
}。
構造体のパディングがこの構造にどのように適用されるか教えてください。
仮定:整数は4バイト必要です。
回答を待っています。
私の質問は構造体の埋め込みに関するものですか?構造体のパディングの背後にあるロジックを教えてください。構造体の埋め込みはどのように機能しますか?
例:
構造ノード{ char c1;
short s1;
char c2;
int i1;
}。
構造体のパディングがこの構造にどのように適用されるか教えてください。
仮定:整数は4バイト必要です。
回答を待っています。
パディングの仕組みは実装によってまったく異なります。あなたは2バイトshort
と4バイトint
を持ち、型はそのサイズの倍数に整列する必要が実装で
、あなたが持っているでしょう:
Offset Var Size
------ ---- ----
0 c1 1
1 ?? 1
2 s1 2
4 c2 1
5 ?? 3
8 i1 4
12 next
実装はパディングを挿入して自由です何らかの理由で、構造体のフィールド間と最後のフィールドの後(ただし、ではなく、)。配列の後続要素を整列させるためには、構造体の後ろにパッドする機能が重要です。たとえば:
struct { int i1; char c1; };
はあなたを与えることがあります。どちらかの整列されたデータをより高速に動作し、またはずれデータは(一部のCPUアーキテクチャがずれアクセスを許可しない)違法であるため、
Offset Var Size
------ ---- ----
0 i1 4
4 c1 1
5 ?? 3
8 next
パディングは通常行われています。
詳細を説明していただきありがとうございます。 – hims
「これに依存します」を除いて、これに対する簡単な答えはありません。
2バイトのショートを仮定するとわずか8バイト、または12バイトかかるか、または適切に奇妙な実装で42バイトかかる可能性があります。これは、少なくとも基礎となるアーキテクチャ、コンパイラ、およびコンパイラフラグに依存します。情報については、ツールのマニュアルを参照してください。
構造体内では、メモリ内の各メンバのオフセットは、サイズと配置に基づいています。これは実装固有のものであることに注意してください。
など。 char
は、1つのバイトを取る場合、short
は2つのバイトを取り、int
は4つのバイトを取ります
structure Node{
char c1; // 1 byte
// 1 byte padding (next member requires 2 byte alignment)
short s1; // 2 bytes
char c2; // 1 byte
// 3 bytes padding (since next member requires 4 byte alignment)
int i1; // 4 bytes
};
また、これはあなたのコンパイラ設定やアーキテクチャに依存し、また変更することができます。
(メンバーの順序を並べ替えて)この構造を適切にパックした場合、12バイトではなく8バイトに収まるようになります(s1でc2を切り替える)。
アライメントを強制する理由は、ハードウェアが自然なアラインメントを持つデータで特定の操作を高速化できるためです。さもなければ、それを操作する前にデータを構築するためにビットマスク、シフト、およびORを実行しなければならない。
https://stackoverflow.com/questions/29813803/structure-padding/45198135#45198135上記リンクのGovindによる回答をご覧ください。 – Govind