结构体内存分析
2020-09-08 本文已影响0人
清描淡寫_
一.结构体的构成
结构体是由多个成员构成,成员的类型可以是基础数据类型(int、double、bool等)、指针或是其他的结构体。一下是一个结构体的例子:
typedef struct PersonStruct {
double height;
char firstName;
int age;
short weight;
} PersonStruct;
二.计算结构体尺寸大小的规则
1.数据成员对齐规则:
第一个数据成员要放在0的起始位置,之后的成员位置的起始位置要根据自身的大小的整数倍去存放。
2.结构体作为成员:
结构体作为成员时,自身的存储位置要根据结构内的最大成员的整数倍去存储
3.收尾:
结构体的总大小一定是结构体内最大成员的整数倍,实际大小如果不够,则需要进行补齐。
以64位为例:
height的大小为8,firstName的大小为1,age的大小为4,weight的大小为2。根据规则可得这些成员所占位置为:
height:0-7
firstName:8
age:12-15
weight:16-17
可得结构体PersonStruct的实际大小为18,根据规则3以8的整数倍进行补齐可得PersonStruct的大小为24。
图例.png
根据图例可以看出,这样会出现留空的情况,会产生出较多的内存浪费,所以可以优化结构体的成员排列:
typedef struct PersonStruct {
double height;
int age;
short weight;
char firstName;
} PersonStruct;
这样排列会使得结构体PersonStruct的大小由24变为16:
更新排版.png
降低了内存的占用。