次のコードがメモリにどのように配置されるかについて、私は少し戸惑っています。
struct Thing
{
union
{
unsigned value:24;
uint8_t bytes[3];
};
Thing(int v)
:value(v)
{}
void foo()
{
printf("Thing %p value=%d !\n", this, value);
}
} __attribute__((__packed__));
Linux 上の gcc 3.3、4.3、または 4.6 (考えられる特別なオプションなし - 4.6 では "-Wall -g" のみ) では、構造体のサイズは常に 4 です。
$ pahole ./union
struct Thing {
union {
unsigned int value; /* 4 */
unsigned char bytes[3]; /* 3 */
};
[...]
構造体に unsigned value:24 があり、誰かが共用体を追加して、構造体のサイズを誤って 3 バイトから 4 バイトに増やした、似たようなコードがいくつかありました。ユニオンを「パック」として定義しようとすると、同じことが起こります。サイズはまだ 4 です。この動作は C++ 仕様どおりですか? 説明は何ですか?
後で編集:「C 仕様」を「C++ 仕様」に置き換えました。