结构体的大小&&结构体的内存对齐
结构体在内存中存储时也满足一定的存储规则
结构体对齐规则
-
第一个成员在存储地址的0偏移位置处。
-
其他成员存储到对齐数的整数倍。
(对齐数:编译器默认的对齐数与该成员的较小值, vs环境下默认对齐数位8位 Linux下 默认对齐数位4)
-
结构体的总大小为(每个成员变量都有一个对齐数)最大对齐数的整数倍。
-
结构体进行嵌套时,嵌套的结构体对齐到自己最大对齐数的整数倍,结构体总的大小就是最大对齐数的整数倍(包含嵌套结构体的对齐数)
存在内存对齐的原因
平台原因(移植原因):不是所有的平台都可以在任意地址位置读取数据,有的平台只能在特定位置读取特定类型的数据
性能原因:访问时可能存在某中规则,为了访问未对齐的内存,访问一块数据时可能要访问两次,并将他们拼起来。
所以这是属于空间换时间的做法。
将占用空间小的内存尽可能的放在一起,减少因边界对齐而带来的损失。
struct seqlist
{
int a;
int b;
char c;
}//12
struct p
{
char b;
struct seqlist s;
int a;
}//24
offseof 宏确定结构中成员的实际位置
offsetof(type,member)
type:结构体类型 member:成员名
返回值 size_t 偏移量 这个指定的成员的实际位置距离结构体开始存储位置偏移了几个字节数