C & C++ FAQ
目次
C
C++
構造体の大きさがメンバの合計とならないのはどうしてですか。
char
型オブジェクトの大きさは1バイトですが、それ以外の型のオブジェクトは、処理系や環境によっては、偶数番地を先頭に配置される、あるいは
4
で割り切れる番地を先頭に配置される、といった制限を受けることがあります。
このように、『特定の型のオブジェクトを特定のバイトアドレスの倍数のアドレスをもつ記憶域境界に割り付ける要求』のことを、
境界調整
(
alignment
)と呼びます。
図の構造体を考えましょう。ここで、
siezof(int)
が
2
であると仮定します。
int
型の配置に制限を受けない処理系では、構造体
test
は
(a)
のように
4
バイトとなります。
int
型オブジェクトを偶数番地を先頭にして配置する処理系では、
(b)
に示すように、メンバ
nx
を偶数番地に配置するために、網掛け部に示す《詰めもの》が埋め込まれ
6
バイトの領域を占有することになります。
■ 根拠 ■
標準C
§6.5.2.1
Structure and union specifiers
標準C
99
§6.7.2.1
Structure and union specifiers
標準C++
§5.3.3
Sizeof
戻る