sizeof(struct )大小讨论
2016-06-10 13:16
204 查看
struct 结构大小和顺序、#progma pack参数有关系
针对字节对齐,环境使用的gcc version 3.2.2编译器(32位x86平台)为例。
char 长度为1个字节,short 长度为2个字节,int 长度为4个字节。
struct 子项在内存中的按顺序排列,在没有#progma pack(n)参数的情况,各个子项的对齐系数为自己长度。
在有#progma pack(n)参数的情况,各子项的对齐系数为min(自己长度,n);
struct 整体的对其系数为子项对齐系数最大值
看下面的例题:
struct A{
char a; //字长1对其系数1
char b; //字长1对其系数1
char c; //字长1对其系数1
};//整体对其系数为1
sizeof(struct A)值是
看下图
绿色为被填充的内存,黄色为空
因此sizeof(struct A)=3;
struct B {
int a; //对其系数4
char b; //对其系数1
short c; //对其系数2
};//整体对其系数4
sizeof(strcut B)值是
如图
short c对其系数2必须和偶地址对其,int a同理也与能4的倍数地址对其。
粉色内存被结构占用
因此
sizeof(strcut B)=8
struct C {
char b; //对其系数1
int a; //对其系数4
short c; //对其系数2
};//整体对其系数4
sizeof(struct C)的值是
如图
int a 从4的倍数地址开始,所以开始地址是4,因为结构整体对其系数为4,因此short c后的两个内存被占用,使大小为4的倍数。
sizeof(struct C)=12
#progma pack (2)
struct D {
char b; //对其系数min(长度=1,n=2)=1
int a; //对其系数min(长度=4,n=2)=2
short c; //对其系数min(长度=2,n=2)=2
};//整体对其系数2
sizeof(struct D)值是
如图
#progma pack (2) 对int a的放置产生影响,
#progma pack (n) 只能取1、2、4
因此 sizeof(struct D)=8
至此stuct大小讨论,大致明了
针对字节对齐,环境使用的gcc version 3.2.2编译器(32位x86平台)为例。
char 长度为1个字节,short 长度为2个字节,int 长度为4个字节。
struct 子项在内存中的按顺序排列,在没有#progma pack(n)参数的情况,各个子项的对齐系数为自己长度。
在有#progma pack(n)参数的情况,各子项的对齐系数为min(自己长度,n);
struct 整体的对其系数为子项对齐系数最大值
看下面的例题:
struct A{
char a; //字长1对其系数1
char b; //字长1对其系数1
char c; //字长1对其系数1
};//整体对其系数为1
sizeof(struct A)值是
看下图
绿色为被填充的内存,黄色为空
因此sizeof(struct A)=3;
struct B {
int a; //对其系数4
char b; //对其系数1
short c; //对其系数2
};//整体对其系数4
sizeof(strcut B)值是
如图
short c对其系数2必须和偶地址对其,int a同理也与能4的倍数地址对其。
粉色内存被结构占用
因此
sizeof(strcut B)=8
struct C {
char b; //对其系数1
int a; //对其系数4
short c; //对其系数2
};//整体对其系数4
sizeof(struct C)的值是
如图
int a 从4的倍数地址开始,所以开始地址是4,因为结构整体对其系数为4,因此short c后的两个内存被占用,使大小为4的倍数。
sizeof(struct C)=12
#progma pack (2)
struct D {
char b; //对其系数min(长度=1,n=2)=1
int a; //对其系数min(长度=4,n=2)=2
short c; //对其系数min(长度=2,n=2)=2
};//整体对其系数2
sizeof(struct D)值是
如图
#progma pack (2) 对int a的放置产生影响,
#progma pack (n) 只能取1、2、4
因此 sizeof(struct D)=8
至此stuct大小讨论,大致明了
相关文章推荐
- many-to-many
- 农村土地确权之调查公示 ——第二轮公示注意事项说明
- Hibernate OneToOne关联
- 35 windows_35_Thread_Tls 线程局部存储
- ios UI常用类和类与类之间的关系
- 设计模式----单例模式
- OneToMany/ManyToOne关联
- ACM:蓝桥杯:日期计算(闰年判断方法)
- JUnit4学习总结
- Hibernate映射集合(JDK以及嵌入式值类)
- 最全的Git操作要点大总结(从零开始)
- hibernate级联删除错误
- 34 windows_34_Thread_Base 线程基础
- 我写的一些前端开源项目(均托管到github)
- progress进度条
- Python
- HIbernate继承映射策略
- 33 windows_33_Proc_windows_job 进程,windows作业
- 团队二阶段冲刺个人工作总结8
- Android中的线程池ThreadPoolExecutor