类成员内存对齐原则

liyoubaidu 2012-02-13 04:15:03
请问,vc下类的对齐原则是什么?
...全文
200 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
whgale 2012-02-13
  • 打赏
  • 举报
回复
对齐规则1

数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照 #pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。



a=数据成员自动长度

b=#pragma pack指定的数值n,n的取值范围为1,2,4,8,16

该数据成员对齐字节=min(a,b)



对齐规则2

结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。






a=结构(或联合)最大数据成员长度

b=#pragma pack指定的数值n,n的取值范围为1,2,4,8,16

该数据成员对齐字节=min(a.b)



对齐规则3

当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。



a=max(所有数据成员长度)

If(n>a){n无效}



对齐规则4

第一个数据成员偏移量为0。其他各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数,倍数为1。



a=0 ,a代表第一个数据成员偏移量

b=成员变量占用字节数

n=偏移量

n%b=0



对齐规则5

各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节自动填充。



对齐规则6

同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。



a=结构中占用最大空间的类型所占用的字节数

b=结构中除最后一个成员变量,其他成员所占字节之和

结构体大小=大于b且是a的倍数的最小数。



对齐规则7

通过预编译命令改变对齐系数为1的时候,结构的大小等于结构体各个成员变量占用字节之和。各成员变量依次存放,不产生填充字节。

  • 打赏
  • 举报
回复
google 内存对齐。适用类成员。
whgale 2012-02-13
  • 打赏
  • 举报
回复
最长字节

64,321

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧