小编典典

Structure padding and packing

all

考虑:

struct mystruct_A
{
   char a;
   int b;
   char c;
} x;

struct mystruct_B
{
   int b;
   char a;
} y;

结构的大小分别为 12 和 8。
这些结构是填充的还是包装好的?

何时进行填充或包装?


阅读 86

收藏
2022-05-06

共1个答案

小编典典

填充 将结构成员与“自然”地址边界对齐int- 例如,成员将具有偏移量,这些偏移量mod(4) == 0位于 32 位平台上。默认情况下填充是打开的。它将以下“间隙”插入到您的第一个结构中:

struct mystruct_A {
    char a;
    char gap_0[3]; /* inserted by compiler: for alignment of b */
    int b;
    char c;
    char gap_1[3]; /* -"-: for alignment of the whole struct in an array */
} x;

另一方面,Packing__attribute__((__packed__))会阻止编译器进行填充 - 这必须明确要求 - 在 GCC 下它是,所以如下:

struct __attribute__((__packed__)) mystruct_A {
    char a;
    int b;
    char c;
};

6在 32 位架构上生成大小结构。

不过需要注意的是 - 在允许它的架构(如 x86 和 amd64)上,未对齐的内存访问速度较慢,并且在SPARC等严格对齐的架构上被明确禁止。

2022-05-06