我对以下代码如何在内存中布局感到有些困惑:
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 */
};
[...]
我们在这里有一些类似的代码,其中我们在结构中具有无符号值:24,并且有人添加了联合并无意中将结构的大小从 3 个字节增加到了 4 个字节。如果我尝试将联合定义为“打包”,也会发生同样的事情 - 大小仍然是 4。这种行为是否符合 C++ 规范?会有什么解释?
稍后编辑:将“C 规范”替换为“C++ 规范”。