集約と共用体
更新 : 2007 年 11 月
配列、構造体、共用体などの、その他の型には、集約と共用体の一貫したストレージおよびデータ取得を確実に行うためのきわめて厳密なアライメント要件が存在します。配列、構造体、および共用体の定義を次に示します。
配列
隣接するデータ オブジェクトの順序付けグループを含みます。各オブジェクトを配列の要素といいます。配列内のすべての要素は、サイズおよびデータ型が同じです。構造体
データ オブジェクトの順序付けグループを含みます。配列の要素とは異なり、構造体のデータ オブジェクトのデータ型とサイズは、それぞれ異なります。構造体の各データ オブジェクトを、メンバといいます。共用体
名前付きメンバ セットのいずれか 1 つを保持するオブジェクトです。名前付きセットのメンバには、任意の型を指定できます。共用体に割り当てられるストレージは、その共用体で最も大きいメンバが必要とするストレージに、アライメントに必要な埋め込みを加えたものです。
共用体と構造体のスカラ メンバに対して強く推奨されるアライメントを次の表に示します。
スカラ型 |
C データ型 |
必要なアライメント |
INT8 |
char |
バイト型 |
UINT8 |
unsigned char |
バイト型 |
Int16 |
short |
ワード型 (Word) |
UInt16 |
unsigned short |
ワード型 (Word) |
INT32 |
int、long |
ダブルワード型 (Doubleword) |
UInt32 |
unsigned int、unsigned long |
ダブルワード型 (Doubleword) |
INT64 |
__int64 |
クワドワード型 (Quadword) |
UInt64 |
unsigned __int64 |
クワドワード型 (Quadword) |
FP32 (単精度) |
float |
ダブルワード型 (Doubleword) |
FP64 (倍精度) |
double |
クワドワード型 (Quadword) |
POINTER |
* |
クワドワード型 (Quadword) |
__m64 |
struct __m64 |
クワドワード型 (Quadword) |
__m128 |
struct __m128 |
オクタワード 型 (Octaword) |
適用される集約アライメント規則は次のとおりです。
配列のアライメントは、配列の中の 1 つの要素のアライメントと同じです。
構造体または共用体の開始位置のアライメントは、個々のメンバの中での最大アライメントです。構造体または共用体の各メンバは、上の表の定義に従って、適切なアライメントで位置づける必要があります。また、アライメントには、前のメンバに従って暗黙的な内部埋め込みが必要になる場合があります。
構造体のサイズは、そのアライメントの整数倍であることが必要です。アライメントでは、最後のメンバの後に埋め込みが必要になる場合があります。構造体や共用体は配列でグループ化される場合があるため、構造体や共用体の各配列要素は、あらかじめ定義した適切なアライメントで開始および終了する必要があります。
以前の規則が維持されている間は、アライメント要件より大きくなるようにデータを配置できます。
サイズ上の理由により、各コンパイラは構造体のパッキングを調整できます。たとえば、/Zp (構造体メンバの配置) を使用して、構造体のパッキングを調整できます。