2012-08-03 41 views
1

让我更清楚, 我想填充一个内部结构我该怎么做..?例 -如何打包结构内部的结构

其中struct b

struct b{ 
    u_int32_t aa; 
    u_int32_t bb; 
}; 

struct c{ 
    u_int64_t cc; 
}; 

现在,我的编译器操作的方式的结构b和c以struct d之间8字节的填充。那么,我如何摆脱这一点?

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

结构d {

struct b; 

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

struct c; 

} 

请,有人可以帮助我。

+0

[C结构的填充(http://stackoverflow.com/questions/4128061/c-struct-padding) – 2012-08-03 03:55:34

+0

您正在使用什么编译器可能重复? GCC使用'__attribute__',而MSVC使用'#pragma'。 – 2012-08-03 04:00:04

回答

2

从标签,我推断你在Linux上。 GCC认识到以下属性:

__attribute__((packed)) 

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

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