内存字节对齐
来源:百度文库 编辑:神马文学网 时间:2024/04/25 14:05:39
写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧./******************************分割线如果体系结构是不对齐的,A中的成员将会一个挨一个存储,从而sizeof(a)为11。显然对齐更浪费了空间。那么为什么要使用对齐呢?
体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。假设一个体系结构的字长为w,那么它同时就假设了在这种体系结构上对宽度为w的数据的处理最频繁也是最重要的。它的设计也是从优先提高对w位数据操作的效率来考虑的。比如说读写时.............此处省略50万字***********************************************************/上面是你随便 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 bb
{
int id; //[0]....[3]
double weight; //[8].....[15] 原则1
float height; //[16]..[19],总长要为8的整数倍,补齐[20]...[23] 原则3
}BB;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< return 0;
}结果是48 24
ok,上面的全看明白了,内存对齐基本过关.再讲讲#pragma pack().在代码前加一句#pragma pack(1),你会很高兴的发现,上面的代码输出为32 16
bb是4+8+4=16,aa是2+4+8+2+16=32;这不是理想中的没有内存对齐的世界吗.没错,#pragma pack(1),告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则.明白了不?那#pragma pack(2)的结果又是多少呢?对不起,5分钟到了,自己去测试吧
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx
体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。假设一个体系结构的字长为w,那么它同时就假设了在这种体系结构上对宽度为w的数据的处理最频繁也是最重要的。它的设计也是从优先提高对w位数据操作的效率来考虑的。比如说读写时.............此处省略50万字***********************************************************/上面是你随便 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 bb
{
int id; //[0]....[3]
double weight; //[8].....[15] 原则1
float height; //[16]..[19],总长要为8的整数倍,补齐[20]...[23] 原则3
}BB;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<
}结果是48 24
ok,上面的全看明白了,内存对齐基本过关.再讲讲#pragma pack().在代码前加一句#pragma pack(1),你会很高兴的发现,上面的代码输出为32 16
bb是4+8+4=16,aa是2+4+8+2+16=32;这不是理想中的没有内存对齐的世界吗.没错,#pragma pack(1),告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则.明白了不?那#pragma pack(2)的结果又是多少呢?对不起,5分钟到了,自己去测试吧
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx
内存字节对齐
5分钟搞定内存字节对齐
字节对齐
C语言:内存字节对齐详解 - linux内核/驱动 - LinuxSmartphone
字节对齐详解|字节对齐,详解
字节对齐详解|字节对齐,详解
字节对齐详解
内存对齐
什么是字节对齐,为什么要对齐
什么是字节对齐,为什么要对齐
关于字节对齐的问题。
结构体字节对齐问题
结构体字节对齐问题
关于内存对齐
内存地址对齐
关于字节对齐【转载】 - liond8‘ blog
[转载]内存对齐_Cecil Zhang
内存对齐的小总结
详解C语言字节对齐 - 21IC中国电子网
也谈内存对齐 :: Tony Bai
内存表示,位运算及字节序
内存表示,位运算及字节序 - *无名小卒* - CSDNBlog
内存对齐与ANIS C中结构体的内存分配
内存对齐与ANSI C中struct型数据的内存布局(转贴) - C&C - 中国代码...