字节对齐导致sizeof()比实际更大
2015-06-10 20:31
218 查看
转载地址
写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧.
/[b]********************[/b]分割线
先来定义一个结构体
如果体系结构是不对齐的,A中的成员将会一个挨一个存储,从而sizeof(a)为11。显然对齐更浪费了空间。那么为什么要使用对齐呢?
体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。假设一个体系结构的字长为w,那么它同时就假设了在这种体系结构上对宽度为w的数据的处理最频繁也是最重要的。它的设计也是从优先提高对w位数据操作的效率来考虑的。比如说读写时………….此处省略50万字
[b]*************************************************[/b]/
上面是你随便 google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则:(在没有#pragma pack宏的情况下,务必看完最后一行 )
1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。
2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.
等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:
typedef struct aa
{
char name[2]; //[0],[1]
int id; //[4]…[7] 原则1
double score; //[8]….[15]
short grade; //[16],[17]
BB b; //[24]……[47] 原则2
}AA;
int main()
{
AA a;
cout<
写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧.
/[b]********************[/b]分割线
先来定义一个结构体
[code]typedef struct bb { int id; //[0]....[3] double weight; //[8].....[15] 原则1 float height; //[16]..[19],总长要为8的整数倍,补齐[20]...[23] 原则3 }BB;
如果体系结构是不对齐的,A中的成员将会一个挨一个存储,从而sizeof(a)为11。显然对齐更浪费了空间。那么为什么要使用对齐呢?
体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。假设一个体系结构的字长为w,那么它同时就假设了在这种体系结构上对宽度为w的数据的处理最频繁也是最重要的。它的设计也是从优先提高对w位数据操作的效率来考虑的。比如说读写时………….此处省略50万字
[b]*************************************************[/b]/
上面是你随便 google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则:(在没有#pragma pack宏的情况下,务必看完最后一行 )
1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。
2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.
等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:
typedef struct aa
{
char name[2]; //[0],[1]
int id; //[4]…[7] 原则1
double score; //[8]….[15]
short grade; //[16],[17]
BB b; //[24]……[47] 原则2
}AA;
int main()
{
AA a;
cout<
相关文章推荐
- JSONObject 试错
- 已定义的函数有返回值,函数调用可以作为一个函数的实参,但是不能作为形参
- 如何花两年时间面试一个人
- CPU读取磁盘数据的操作时序(CPU和磁盘控制器)
- Android 手动按power键上锁,没有锁屏提示音,无法恢复【单机必现】
- cxf框架和spring框架集成的Webservice例子
- Android中的android:layout_width和android:width
- 企业如何快速搭建大数据处理系统
- Convert Sorted Array to Binary Search Tree
- python解析pcap文件中的http数据包
- 五大算法---分治算法
- BZOJ 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐( dfs )
- Visual studio 包含目录,库目录搞错了怎么办
- div添加contenteditable属性
- 【源代码】StringBuilder和StringBuffer震源深度分析
- 16进制的简单运算
- 关于union大小的计算
- 在O(1)时间删除链表结点
- PagerAdapter 页面无法刷新问题
- 检测色卡饱和度和色彩偏差