【发布时间】:2012-09-05 05:01:59
【问题描述】:
我对以下代码如何在内存中布局感到有些困惑:
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++ 规范”。
【问题讨论】:
标签: c++ gcc unions bit-fields memory-layout