sizeof计算结构体大小(字节对齐)

来源:互联网 发布:php教学网站 编辑:程序博客网 时间:2024/03/29 10:21

引言:sizeof计算结构体的大小经常出现在笔试题中,接下来是对它的一些总结

1.计算结构体大小的准则

  • 数据类型 32位机大小(字节) 64位机大小(字节) char 1 1 short 2 2 int 4 4 long 4 8 指针类型 4 8 double 8 8 float 4 4 unsigned int 4 4 long long 8 8
  • #pragma pack(n)可以指定对齐值为n(n取1,2,4,8,16)
  • 结构体每个变量的 自身对齐移值 = 自身字节大小
  • 有效对齐值 = min(自身对齐值,指定对齐值)
  • 结构体的自身对齐值为其变量的最大自身对齐值;有效对齐值 = min(自身对齐值,指定对齐值)
  • 结构体每个变量相对结构体首地址的偏移量必须是其有效对齐值的整数倍,否则需要后移直到偏移量为有效对齐值整数倍
  • 结构体大小为最后一个变量偏移量+最后一个变量大小+补充字节数(之所以要有补充字节数是因为结构体大小需要时有效对齐值得整数倍)
  • 空结构体大小为1

2.例子

#pragma pack(8)struct s1{    short a;    long b;};struct s2{    char c;    s1 d;    long long e;};//求sizeof(s2)的值?(32位机)

解:
1. 先看s1,a的有效对齐值为min(2,8)=2,偏移量为0,0%2=0,符合;b的有效对齐值为min(4,8)=4,偏移量本该是0+2=2,但是2%4!=0,所以其偏移量变成4;结构体大小为b的偏移量+b的字节数=4+4=8,结构体s1的有效对齐值为min(4,8)=4,因为8%4=0,所以不需要加补充字节数
2. 再看s2,c的有效对齐值为min(1,8)=1,偏移量为0,0%1=0,符合;d得有效对齐值为上面计算的8,d的偏移量本该是0+1=1,但是1%4!=0,所以d偏移量变成4;e的有效对齐值为min(8,8)=8,e的偏移量本该是d的偏移量加上其大小,为4+8=12,但是12%8!=0,所以e得偏移量为16;s2的大小为16+8=24,因为s2的有效对齐值为min(8,8)=8,24%8=0,所以不需要加补充字节数,s2大小为24

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机卡中 剩余话费怎么办 小米被流量限制怎么办 支付宝禁止联网怎么办 手机号登录不上怎么办 电信手机号无法打电话怎么办 新手机号无法注册怎么办 电信手机怎么办流量包 qq华夏到监牢怎么办 炫舞被骗2900怎么办 qq好友申诉后怎么办 无好友辅助申请怎么办 辅助申诉成功后怎么办 qq绑不了手机号怎么办 新办号码有微信怎么办 两手机互换号后微信怎么办 手机申请不了qq怎么办 快手账号保护了怎么办 qq号过期登不上怎么办 xp 登陆界面不见了怎么办 手机号qq 别人登录怎么办 qq号申请频繁怎么办 qq号实名验证怎么办 陌陌没法注册怎么办 腾讯q币充值错误怎么办 手机号码注册微信号怎么办 q币充错了号怎么办 微信超额度提现都不可以怎么办 微信发红包转账限额怎么办 银行卡没设密码怎么办 宜人贷逾期一天怎么办 快手实名已认证怎么办 爱奇艺充会员没有银行卡怎么办 手机qq内存太大怎么办 借呗逾期半年怎么办 支付宝支付错误怎么办 小米6支付宝闪退怎么办 验证码发送失败怎么办 支付宝升级后打不开怎么办 steam支付宝失败怎么办 支付宝无响应怎么办 花呗加载失败怎么办