结构填充如何工作?

时间:2012-03-30 07:27:45

标签: structure padding

My Questing是关于结构填充?任何人都可以告诉我结构填充背后的逻辑。

示例:

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

任何人都可以告诉我结构填充将如何应用于此结构吗?

假设:整数需要4个字节。

等待答案。

3 个答案:

答案 0 :(得分: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架构不允许错位访问)。

答案 1 :(得分:0)

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

它可能只有8个字节,假设有两个字节短路,或者可能需要12个字节,或者在一个适当奇怪的实现上可能需要42个字节。它至少取决于底层架构,编译器和编译器标志。有关信息,请查阅工具手册。

答案 2 :(得分: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来构造数据,然后再对其进行操作。