即使不需要,编译器也会应用结构填充

Meh*_*ife 2 c struct padding cpu-architecture memory-alignment

我试图了解结构填充在 C 中的工作原理。特别是在 Linux x86-64 环境中。为此,我重新排列了给定结构的成员的顺序,以查看在不需要时是否不会应用填充。然而,当我编译并运行打印每个结构的大小的代码时,填充被应用于它们两个,即使第二个结构(struct b)的成员以这样的方式排列,连续地将它们存储在内存中不会导致其中之一占据多个字块。

#include <stdio.h>

struct a {
    int ak; 
    char ac; 
    char* aptr; 
};

struct b {
    char* bptr;
    int bk;
    char bc;
};



int main(int argc, char* argv[]) {
    printf("%lu\n", sizeof(struct a));
    printf("%lu\n", sizeof(struct b));
}

Run Code Online (Sandbox Code Playgroud)

输出:

16

16
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 5

最大的成员struct b(或更准确地说,具有最宽对齐要求的成员)具有 8 字节对齐,因此结构的大小需要是 8 的倍数,以便该结构的数组将使其成员正确对齐。

所以struct b最后会有 3 个字节的填充。