2012-03-30 60 views
0

我的追求是关于结构填充?任何人都可以告诉我结构填充的逻辑是什么。结构填充如何工作?

实施例:

结构节点{ char c1; short s1; char c2; int i1; };

任何一个可以告诉我,结构填充将如何运用这种结构?

假设:整数需要4字节。

等待答案。

+0

https://stackoverflow.com/questions/29813803/structure-padding/45198135#45198135在上面的链接中查看Govind的答案 – Govind 2017-07-19 18:23:22

回答

1

填充的工作方式完全取决于实现。

对于您有两个字节short和四字节int和类型必须对齐其大小的多种实现,你将有:

Offset Var Size 
------ ---- ---- 
    0  c1  1 
    1  ??  1 
    2  s1  2 
    4  c2  1 
    5  ??  3 
    8  i1  4 
    12 next 

的实现可以自由插入填充无论出于任何原因,在结构的字段之间并且跟随最后一个字段(但是在第一个字段之前的而不是)之后。填充结构之后的能力对于对齐数组中的后续元素很重要。例如:

struct { int i1; char c1; }; 

可能会给你:

Offset Var Size 
------ ---- ---- 
    0  i1  4 
    4  c1  1 
    5  ??  3 
    8 next 

填充通常是这样做,因为无论是对齐的数据工作更快,或错位的数据是非法的(一些CPU架构不允许对齐的访问)。

+0

感谢您的详细解释。 – hims 2013-12-19 10:37:15

0

有没有简单的答案,除了“这取决于”。

它可以是少至8个字节,假定两个字节短裤,或它可能需要12个字节,或者它可以采取适当奇异实现42个字节。它至少取决于底层架构,编译器和编译器标志。查看您的工具手册以获取信息。

0

里面一个结构中,每个构件在存储器的偏移是基于它们的大小和取向。请注意,这是特定实施方案

E.g.如果需要char 1个字节,short占用2个字节和int需要4个字节:你的编译器的设置和结构

structure Node{ 
    char c1; // 1 byte 
       // 1 byte padding (next member requires 2 byte alignment) 
    short s1; // 2 bytes 
    char c2; // 1 byte 
       // 3 bytes padding (since next member requires 4 byte alignment) 
    int i1; // 4 bytes 
}; 

这也取决于,并且也可以被修改。

如果妥善包装该结构(通过重新排列成员的顺序),即可装配成8个字节,而不是12个字节(通过用S1切换C2)。

对齐强制执行的原因是,硬件可以使用自然对齐的数据更快地执行某些操作;否则在操作数据之前,必须执行一些位屏蔽,移位和ORing操作来构造数据。