欢迎来到天天文库
浏览记录
ID:16805381
大小:50.73 KB
页数:5页
时间:2018-08-24
《内存对齐的规则以及作用》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、内存对齐的规则以及作用Postedon2009-03-1609:36蜗牛先生阅读(3831)评论(5) 编辑 收藏引用所属分类:C++ 首先由一个程序引入话题: 1 //环境:vc6 + windows sp2 2 //程序1 3 #include 4 5 using namespace std; 6 7 struct st1 8 { 9 char a ;10 int b ;11 short c ;12 };13 14 struct st215 {
2、16 short c ;17 char a ;18 int b ;19 };20 21 int main()22 {23 cout<<"sizeof(st1) is "<3、体,为什么sizeof的时候大小不一样呢?20currencydeposit,weprescribeapassonaregularbasis,qilucardaccountonaregularbasis),certificatebondsandsavingsbonds(electronic);3.notdrawnonabanksavingscertificate,certificatebondsapplyformortgageloans,acceptingonlythelender本文的主要目的就是解释明白这一4、问题。 内存对齐,正是因为内存对齐的影响,导致结果不同。对于大多数的程序员来说,内存对齐基本上是透明的,这是编译器该干的活,编译器为程序中的每个数据单元安排在合适的位置上,从而导致了相同的变量,不同声明顺序的结构体大小的不同。 那么编译器为什么要进行内存对齐呢?程序1中结构体按常理来理解sizeof(st1)和sizeof(st2)结果都应该是7,4(int)+2(short)+1(char)=7。经过内存对齐后,结构体的空间反而增大了。在解释内存对齐的作用前,先来看下内存对齐的规则:1、 对于结构5、的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragmapack()指定的数,这个数据成员的自身长度)的倍数。2、 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照min(#pragmapack指定的数值和结构(或联合)最大数据成员长度),比较小的那个进行。 #pragmapack(n)表示设置为n字节对齐。VC6默认8字节对齐以程序1为例解释对齐的规则:St1:char占一个字节,起始偏移为0,int占4个字节,min(#pragmapack()指定6、的数,这个数据成员的自身长度)=4(VC6默认8字节对齐),所以int按4字节对齐,起始偏移必须为4的倍数,所以起始偏移为4,在char后编译器会添加3个字节的额外字节,不存放任意数据。short占2个字节,按2字节对齐,起始偏移为8,正好是2的倍数,无须添加额外字节。到此规则1的数据成员对齐结束,此时的内存状态为:oxxx7、oooo8、oo20currencydeposit,weprescribeapassonaregularbasis,qilucardaccountonaregularbasis),certi9、ficatebondsandsavingsbonds(electronic);3.notdrawnonabanksavingscertificate,certificatebondsapplyformortgageloans,acceptingonlythelender0123456789(地址)(x表示额外添加的字节)共占10个字节。还要继续进行结构本身的对齐,对齐将按照#pragmapack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行,st1结构中最大数据成员长度为int,占4字节,而默认10、的#pragmapack指定的值为8,所以结果本身按照4字节对齐,结构总大小必须为4的倍数,需添加2个额外字节使结构的总大小为12。此时的内存状态为:oxxx11、oooo12、ooxx0123456789ab (地址)到此内存对齐结束。St1占用了12个字节而非7个字节。 St2的对齐方法和st1相同,读者可自己完成。 内存对齐的主要作用是:1、 平台原因(移植原因):不是所有的硬件平台都能
3、体,为什么sizeof的时候大小不一样呢?20currencydeposit,weprescribeapassonaregularbasis,qilucardaccountonaregularbasis),certificatebondsandsavingsbonds(electronic);3.notdrawnonabanksavingscertificate,certificatebondsapplyformortgageloans,acceptingonlythelender本文的主要目的就是解释明白这一
4、问题。 内存对齐,正是因为内存对齐的影响,导致结果不同。对于大多数的程序员来说,内存对齐基本上是透明的,这是编译器该干的活,编译器为程序中的每个数据单元安排在合适的位置上,从而导致了相同的变量,不同声明顺序的结构体大小的不同。 那么编译器为什么要进行内存对齐呢?程序1中结构体按常理来理解sizeof(st1)和sizeof(st2)结果都应该是7,4(int)+2(short)+1(char)=7。经过内存对齐后,结构体的空间反而增大了。在解释内存对齐的作用前,先来看下内存对齐的规则:1、 对于结构
5、的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragmapack()指定的数,这个数据成员的自身长度)的倍数。2、 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照min(#pragmapack指定的数值和结构(或联合)最大数据成员长度),比较小的那个进行。 #pragmapack(n)表示设置为n字节对齐。VC6默认8字节对齐以程序1为例解释对齐的规则:St1:char占一个字节,起始偏移为0,int占4个字节,min(#pragmapack()指定
6、的数,这个数据成员的自身长度)=4(VC6默认8字节对齐),所以int按4字节对齐,起始偏移必须为4的倍数,所以起始偏移为4,在char后编译器会添加3个字节的额外字节,不存放任意数据。short占2个字节,按2字节对齐,起始偏移为8,正好是2的倍数,无须添加额外字节。到此规则1的数据成员对齐结束,此时的内存状态为:oxxx
7、oooo
8、oo20currencydeposit,weprescribeapassonaregularbasis,qilucardaccountonaregularbasis),certi
9、ficatebondsandsavingsbonds(electronic);3.notdrawnonabanksavingscertificate,certificatebondsapplyformortgageloans,acceptingonlythelender0123456789(地址)(x表示额外添加的字节)共占10个字节。还要继续进行结构本身的对齐,对齐将按照#pragmapack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行,st1结构中最大数据成员长度为int,占4字节,而默认
10、的#pragmapack指定的值为8,所以结果本身按照4字节对齐,结构总大小必须为4的倍数,需添加2个额外字节使结构的总大小为12。此时的内存状态为:oxxx
11、oooo
12、ooxx0123456789ab (地址)到此内存对齐结束。St1占用了12个字节而非7个字节。 St2的对齐方法和st1相同,读者可自己完成。 内存对齐的主要作用是:1、 平台原因(移植原因):不是所有的硬件平台都能
此文档下载收益归作者所有