A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 晗修 中级黑马   /  2015-6-7 11:27  /  632 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看视屏看到结构体的存储问题时
视频中 struct A {    short   a; char   b; float c; double d;  }
structB {    short   a; float c;  char   b;double d;  }
两个结构体占用字节数分别是16 和24 ;但是视频中没有说清楚,自己查了下结构体的存储,分享下结果;
结构体存储时对齐分两个步:
这里我们认为pragama pack没有定义 无视他
1)结构体成员的对齐
此时对齐模数是当前要对齐的结构体成员的长度和【#pragma pack】中较小的那个
structA: a占用 2字节;
                b是char 1个字节 已经对齐 所以a到b是3字节;   
                c是float  占用4字节,但是之前a到b只占用了3字节,前面要补齐一个 ,所以a~c占用4+4=8个字节
                d是double 占用8字节   a~c也是8ge 无需对齐 所以整体占用8+8=16个字节
structB: a占用 2字节;
                b是float 4个字节 没有对齐 所以a之后要补2个字节   所以a到b是2+2+4=8个字节;   
                c是char 占用1字节,已经对齐,所以a~c占8+1=9个字节
                d是double 占用8字节   a~c是9个字节 对齐需补足7个字节  所以 a~d要占用9+7+8=24个字节

2)结构体整体的对齐
此时对齐模数是当前要(所有结构体成员中最长的)和【#pragma pack】中较小的那个
A和B都已经对齐,这个步骤其实很简单 就看步骤1得到的能不能被最长的整除 不能就补;可以的话就不用了。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马