关于struct大小的计算
2015-06-11 12:33
375 查看
结构是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。
struct类型的计算分为三步:先算struct的对齐大小,对齐的大小也是取决于struct成员中字节对齐最大的那个;然后根据每个成员的对齐大小对齐每个成员算出分配的空间;最后算出struct实际分配的空间,在满足对齐每个成员的基础上,满足是Struct对齐大小的整数倍。
Struct S1
{
Char a[13];
Double c;
};
对齐大小为8,对齐每个成员后大小为24,正好是8的整数倍,所以实际分配的大小就为24。
Struct S2
{
S1 a;
U1 b;
};
S1对齐大小为8,U1对齐大小为4,因此S2的对齐大小8,体积大小为大于24+12且要为8的倍数,结果为40。
这里所说的union和struct的对齐,是指其作为其他复杂对象中的元素的时候要求的对齐,对于本身大小的计算并没有关系。本身的大小只和其所包含的基本元素的对齐有关系。
struct的大小和内部元素的排列是有很大关系的,而union里元素排序没关系,因此在使用struct的时候,安排好元素的位置,可以减少结构体的大小。
如:Struct S3
{
char b;
int
c;
char d[13];
};
根据之前的原则,因为c需要4字节对齐,因此b之后会有3字节空余。所以1+3(空余)+4+13=21,要求为4的倍数,则为24。
若更改为
Struct S4
{
Char b;
Char d[13];
Int c;
}
则c之前会空余2字节,所以1+13+2+4=20,并且已经为4的倍数,所以大小就是20。
关于#pragma pack(),该标示用于重新指定对齐的大小,当元素的对齐大于指定的对齐大小的时候,成员和整个对象的对齐大小会采用相对较小的。
如:
Union U3
{
Char a[9];
Double b;
};
该union的对齐为8,大小为16(大于9且为8的倍数)。
若加上
#pragma pack(4)// pack(0)会采用默认的字节(4)
则对于U3中的基本元素b,其对齐由原来的8变为4,而a的对齐仍然是1,则U3的对齐为4,大小为12。
当然U3的对齐也由8变成了4。
struct类型的计算分为三步:先算struct的对齐大小,对齐的大小也是取决于struct成员中字节对齐最大的那个;然后根据每个成员的对齐大小对齐每个成员算出分配的空间;最后算出struct实际分配的空间,在满足对齐每个成员的基础上,满足是Struct对齐大小的整数倍。
Struct S1
{
Char a[13];
Double c;
};
对齐大小为8,对齐每个成员后大小为24,正好是8的整数倍,所以实际分配的大小就为24。
Struct S2
{
S1 a;
U1 b;
};
S1对齐大小为8,U1对齐大小为4,因此S2的对齐大小8,体积大小为大于24+12且要为8的倍数,结果为40。
这里所说的union和struct的对齐,是指其作为其他复杂对象中的元素的时候要求的对齐,对于本身大小的计算并没有关系。本身的大小只和其所包含的基本元素的对齐有关系。
struct的大小和内部元素的排列是有很大关系的,而union里元素排序没关系,因此在使用struct的时候,安排好元素的位置,可以减少结构体的大小。
如:Struct S3
{
char b;
int
c;
char d[13];
};
根据之前的原则,因为c需要4字节对齐,因此b之后会有3字节空余。所以1+3(空余)+4+13=21,要求为4的倍数,则为24。
若更改为
Struct S4
{
Char b;
Char d[13];
Int c;
}
则c之前会空余2字节,所以1+13+2+4=20,并且已经为4的倍数,所以大小就是20。
关于#pragma pack(),该标示用于重新指定对齐的大小,当元素的对齐大于指定的对齐大小的时候,成员和整个对象的对齐大小会采用相对较小的。
如:
Union U3
{
Char a[9];
Double b;
};
该union的对齐为8,大小为16(大于9且为8的倍数)。
若加上
#pragma pack(4)// pack(0)会采用默认的字节(4)
则对于U3中的基本元素b,其对齐由原来的8变为4,而a的对齐仍然是1,则U3的对齐为4,大小为12。
当然U3的对齐也由8变成了4。
相关文章推荐
- android删除文件出错
- Android加载图片导致内存溢出(Out of Memory异常)
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- 用SharedPreferences做setting(设置界面)
- erlang 压力测试工具 tsung
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
- 关于JDK
- linq读写dt
- junit 4 中的Before After Ignore Test BeforeClass AfterClass
- Sublime Text 3 最性感的编辑历史
- MyBatis实战
- C#透明窗体实现方法
- 参数估计(笔记一)
- UIControl-IOS发展
- mysql 基础知识
- 第七课,分支结构程序体验|三个整数输出最大值 |计算两数正差值|周薪计算
- 《柔性字符串匹配》读书笔记(1)之--KMP算法(单模式串匹配、前缀匹配)
- 通过Anuglar Material串串学客户端开发 - javascript编译和gulpfile.js
- 拉面
- #leetcode#Longest Consecutive Sqeuence