構造体のサイズはsizeofをちゃんと使うべき
以下のコードはApple LLVM version 6.1.0 (clang-602.0.53)で8と12を出力します。
ですが、intは4byte、boolは1byteなのでStは5byte、StStは6byteしか使わないため、サイズが増えてしまっています。
#include "stdio.h"
struct St{
int a;
bool flag;
};
struct StSt{
S s;
bool f;
};
int main(void) {
printf("%lu\n", sizeof(St));
printf("%lu\n", sizeof(StSt));
return 0;
}
原因
Cでは構造体の後ろにパディングを追加できるようになっています。
6.7.2.1 Structure and union specifiers
13 Within a structure object, the non-bit-field members and the units in which bit-fields
reside have addresses that increase in the order in which they are declared. A pointer to a
structure object, suitably converted, points to its initial member (or if that member is a
bit-field, then to the unit in which it resides), and vice versa. There may be unnamed
padding within a structure object, but not at its beginning.
そのため、sizeofがパディングを含めた値を返し、変数の合計とは違った値を返してきます。
このように、Cの構造体の大きさはではメンバの合計とは違うため、ちゃんとsizeofを使って計算しないと大変な事になります。1