集約と共用体

更新 : 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 (構造体メンバの配置) を使用して、構造体のパッキングを調整できます。

参照

参照

型とストレージ