关于c:c-语言-struct的内存对齐原则

1次阅读

共计 775 个字符,预计需要花费 2 分钟才能阅读完成。

如何计算得悉 struct 内存大小,这就要从内存对齐准则说起:

内存对齐第一准则

构造体中元素是依照定义程序一个个放到内存中去的,但并不是严密排列的. 每一个元素都认为内存是以它本人的大小来划分的, 因而元素搁置地位肯定是元素内存宽度的整数倍上开始(从构造体首地址上向后找, 找到第一个闲暇的残缺内存)

struct X {char a; //[0]
     int b;//[4,7]
    double c;//[8,15]
} S1;

例如此例,a 存入内存首地址第 0 个字节
存入 b 时,它先从构造体首地址查找,发现第一个 4 字节的空间被 a 占了一个,于是找下一个四字节空间, 从第 4 个字节开始写入,到第 7 个字节完结.
存入 c 时,它先从构造体首地址以字节的大小查找,发现第一个 8 字节的空间被 a、b 占用,于是找一个 8 字节空间,于是从 8 字节写入到 15 字节完结

内存对齐第二准则

构造体占用内存大小,满足内存大小必须为占用最大内存元素的内存大小的整数倍

struct X {char a; //[0]
    double b; //[8,15]
    int c;//[16,20]
}S2;

计算 sizeof(S2)得 24 这是为什么呢,明明是只有 20 字节,这阐明必须满足最大元素的整数倍,所以留了最初 4 个字节是空白

留神: 如果构造体里是个复合构造,比如说数组, 那么会以数组元素内存宽度来做内存排布, 如:

struct label {
    int l_flags;
    union {
        void *l_ptr;
        long l_long;
    } l_perpolicy[N];
};

l_perpolicy 是一个占用 8 * N 内存大小的数组,那么在构造体 label 的内存排布是这样的, 首先排 l_flags,写入 0~3 内存空间,其次写入 l_perpolicy 的第一个元素,从构造体找第一个 8 字节空间发现写入了 l_flags,于是向后找第二个 8 字节空间, 也就是 8~15 写入数组的第一个元素,其余元素以此类推

正文完
 0