我的追求是关于结构填充?任何人都可以告诉我结构填充的逻辑是什么。结构填充如何工作?
实施例:
结构节点{ char c1;
short s1;
char c2;
int i1;
};
任何一个可以告诉我,结构填充将如何运用这种结构?
假设:整数需要4字节。
等待答案。
我的追求是关于结构填充?任何人都可以告诉我结构填充的逻辑是什么。结构填充如何工作?
实施例:
结构节点{ char c1;
short s1;
char c2;
int i1;
};
任何一个可以告诉我,结构填充将如何运用这种结构?
假设:整数需要4字节。
等待答案。
填充的工作方式完全取决于实现。
对于您有两个字节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架构不允许对齐的访问)。
感谢您的详细解释。 – hims 2013-12-19 10:37:15
有没有简单的答案,除了“这取决于”。
它可以是少至8个字节,假定两个字节短裤,或它可能需要12个字节,或者它可以采取适当奇异实现42个字节。它至少取决于底层架构,编译器和编译器标志。查看您的工具手册以获取信息。
里面一个结构中,每个构件在存储器的偏移是基于它们的大小和取向。请注意,这是特定实施方案
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操作来构造数据。
https://stackoverflow.com/questions/29813803/structure-padding/45198135#45198135在上面的链接中查看Govind的答案 – Govind 2017-07-19 18:23:22