如何在结构内部打包结构

时间:2012-08-03 03:53:39

标签: c compiler-construction padding linux-device-driver

让我更清楚一点,  我想填充一个内部结构我该怎么做..?实施例 -

其中struct b

struct b{
  u_int32_t aa;
  u_int32_t bb;
};

struct c{
  u_int64_t cc;
};

现在,我的编译器在struct d中的struct b和c之间进行了8字节的填充。那么,我该如何摆脱它呢?

希望,现在很清楚。有人可以给我一个答案吗?

结构d {

struct b;

struct c; //I want to make this structure a padded one, how to go about it?

struct c;

}

拜托,有人可以帮我这个。

2 个答案:

答案 0 :(得分:2)

从标签中,我推断你是在linux上。 GCC识别以下属性:

__attribute__((packed))

您可以在声明结构之前或之后编写以删除填充。

答案 1 :(得分:0)

事实上,没有在b和c之间放置任何填充

让我们看看为什么,

所有u_int32_t都是32位=> 4字节。现在struct b的大小将是8个字节(4个因为aa而4是因为bb)。此外,struct c的大小也是8个字节。

因此,当struct d成立时,struct bstruct c将依次顺序放置。下一个struct c会直接放在上一个struct c之后。

但是在最后的 struct cstruct d的关闭之后有一个8字节的填充。这是因为,如果要将多个struct d放置在内存中,则第二个struct d将从内存位置24开始而不是32(这很方便)。

如果您想了解更多信息:The Lost Art of C Structure Packing