C语言结构体占用内存计算

727 阅读2分钟

c语言中结构体是一种很常见的类型,通过struct修饰,它在内存中也有对应的存储方式。

假设我们定义了这样一个结构体:

struct S {
    int one;
    char two[5];
    double three;
};

结构体在存储中,会遵循以下几个规则:

1、首个属性对应内存的首位置
2、第二个以之后属性会在对应内存下标(或者内存下标倍数开始)
3、最终占用字节数必须是最大属性的倍数,否则继续添加
4、如果超过最大对齐数,则按最大对齐数计算(不同的编译器,都有对应的最大对齐数,也可以代码设置)

接下来我们看看存储的过程(以上面定义的结构体做例子,假设最大对齐数为8):

先看下面结构体存储模型的图片(画的不是很好,有错误望指点)

image.png

首先会在内存中开辟一块空间,把one属性存放进去,one属性从下标为0开始;

其次存储two属性(结构体属性存储依次往下),two属性就比较讲究了,它会根据属性类型来确定下标,因为char是1,不超过最大对齐数,而且内存下标4是1的整数倍(下标0-3被int用了,最小可用下标对应的内存,就得从4开始);

最后存储double类型,因为double是8个字节,最大对齐数也是8,所以直接用8即可,由于存储one、two属性后,内存下标最小可用为9,9不是8的整数倍,所以不断的取9++,直到8的最小整数倍16开始存储,到23;

three存储后,总共占了0-23下标24个字节内存,这个时候24是最大属性占用字节数(double:8字节)的整数倍(3),所以结构体占用了24个字节内存。

下标9-15部分的内存不用的原因:

因为结构体这样存储是为了加快内存读取速度、兼容一些硬件。这样存储虽然会浪费一部分空间,但是提高了效率,以空间换时间(效率)。