18. 结构体内存结构
设计结构体的数据成员时,容易改变的成员要谨慎考虑,是否要设计为成员。
空结构体占用1字节。空结构体常用来表示十分抽象的事物,抽象到没有数据。为了允许代码获取空结构体变量的地址,所以要给它分配空间。
成员变量内存对齐的原则:
vs的编译选项里可以设置对齐,默认为8字节对齐,/Zp8
设编译对齐值为Zp
一、设成员变量在结构体中的偏移为offset,必须满足:
offset % min(Zp, sizeof(member type)) == 0
二、设结构体变量自身的对齐值为Align,必须满足:
首先,令Align为最大成员的sizeof(type)
然后,令Align为min(Zp, Align)
三、设结构体变量占用内存字节数为size,必须满足:
size % Align == 0
可以自己设置对齐值:
#pragma pack(push) //保存现有对齐值
#pragma pack(1) //设置新对齐值
struct DateOfBirth {
int year; //+0
short month; //+4
char day; //+6
}; //size==7
#pragma pack(pop) //恢复保存的对齐值
假设有如下结构体:
struct Type tag=...
tag.member的地址是:
(int)&tag + member offset
tag.member的值是:
*(member type *)((int)&tag + member offset)