4

以下のように定義された構造体の配列があります。

struct { int x; char y; } arr[10];

私のマシンの int のサイズは 4 バイトで、char は 1 バイトです。構造体が内部的にパディングされることはわかっています。つまり、配列の各要素のサイズは 8 バイトになります。しかし、私は知りたいです

1) これは、次の配列要素の int 型メンバーのアラインメント要件のためです。

2)構造体型変数の自然な位置合わせが必要なため、各構造体自体を8バイト境界に位置合わせする必要があるためですか。

私の主張をより明確にするために、配列の最初のメンバーの開始アドレスは何ですか? 2 番目のケースで指摘されているように、8 バイトにアラインされたアドレスである場合、次のような大きな 2 次元配列を定義する際に問題になる可能性があります。

int arr[1000][1000];

ここで、2 次元配列の各要素 (つまり、各 1 次元配列) は 4000 バイト境界に配置する必要があります。マシンには、このメモリ要件を満たすためのメモリ ホールがない場合があります。

4

1 に答える 1

5

あなたが言及した2つのオプションの違いを理解しているかどうかはわかりません。

C++ のすべての型には自然な位置合わせがあり、そのサイズは倍数です。ただし、配置は必ずしもオブジェクトのサイズと同じではありません。

たとえば、int は通常、4 バイトの自然なアラインメントと 4 バイトのサイズを持ちます。

ただし、1000 int の配列のサイズは 4000 バイトですが、必要なアライメントは 4 バイトだけです。

複合型 (構造体と配列) は、最も整列されたmemberと同じ整列のみを必要とします。1000 個の int の配列には、int 型のオブジェクトのみが含まれます。また、その型には 4 バイトのアラインメントが必要なため、配列全体でも 4 バイトのアラインメントのみが必要です。

同様に、構造体の例では、サイズは (通常) 8 バイトですが、int (4 バイトのアラインメントが必要) と char (1 バイトのアラインメントが必要) で構成されています。したがって、そのメンバーのいずれかが必要とする最も厳密なアラインメントは 4 であり、構造体には 4 バイトのアラインメントが必要です。

于 2013-06-16T19:01:54.900 に答える