18. 结构体内存结构

设计结构体的数据成员时,容易改变的成员要谨慎考虑,是否要设计为成员。

 

空结构体占用1字节。空结构体常用来表示十分抽象的事物,抽象到没有数据。为了允许代码获取空结构体变量的地址,所以要给它分配空间。

 

成员变量内存对齐的原则:

vs的编译选项里可以设置对齐,默认为8字节对齐,/Zp8

设编译对齐值为Zp

一、设成员变量在结构体中的偏移为offset,必须满足:

offset % min(Zp, sizeof(member type)) == 0

 

二、设结构体变量自身的对齐值为Align,必须满足:

首先,令Align为最大成员的sizeof(type)

然后,令Alignmin(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)

posted @ 2020-04-28 21:02  八转达人  阅读(189)  评论(0编辑  收藏  举报