结构体嵌套对齐
64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。
1. 32 位和 64 位C数据类型
32和64位C语言内置数据类型,如下表所示:
上表中第一行的大写字母和数字含义如下所示:
I表示:int类型
L表示:long类型
P表示:pointer指针类型
32表示:32位系统
64表示64位系统
如:LP64表示,在64位系统下的long类型和pointer类型长度为64位。
64位Linux 使用了 LP64 标准,即:long类型和pointer类型长度为64位,其他类型的长度和32位系统下相同类型的长度相同,32位和64位下类型的长度比较见上图的蓝色部分。
下图为在32和64位linux系统下使用sizeof检测出的数据类型的长度。
32位平台下结果:
64位平台下结果:
主流都是64位了。所以都按照64位的来。
sizeof对齐问题。
1,如果class或struct里面有基本类型数组,则数组应该按照结构体对齐值的倍数对齐。
而结构体对齐值应该是基本变量的最大值,这里是int,即4.///4+4structSZ{charc[2];inta;};///2+2+4=8structSZ2{charc[2];shortb;inta;};///4+4+4=12structSZ3{charc[2];inta;shortb;};///4+4+4=12structSZ4{charc[6];inta;};
结果:
sizeof of SZ:8
sizeof of SZ2:8
sizeof of SZ3:12
sizeof of SZ4:12
又这里基本类型最大是long,按8对齐。
///align88*2+8=24structSZ{longc[2];inta;};///align88*2+8=24structSZ2{longc[2];shortb;inta;};///align88+2*8+8+8=40structSZ3{charc[2];longa[2];intb;inti;shorts;};///align848+8=56structSZ4{longc[6];inta;};
sizeof of long:8
sizeof of SZ:24
sizeof of SZ2:24
sizeof of SZ3:40
sizeof of SZ4:56
2,如果class或struct里面有其他自定义类型。 如果基本类型跟的是其他类型,则直接拼接,即使超过对齐数
对齐值是基本类型的最大值。
structTHREE{chara[3];};///align13+1=4structSZ{THREEt;chara;};///align88*2+8=24structSZ2{longc[2];THREEb;inta;};///align41+3+4+4=12structSZ3{charc;THREEt;inti;shorts;};///如果基本类型下一个是其他类型,则直接拼接不用对齐。///align4not4+4+4+4=16//err///align4shouldbe:2+2+1+2+1(null)+4=12structSZ4{charc[2];THREEt;shorts;inta;};///align42+2+1+1+2(null)+4=12structSZ5{charc[2];THREEt;chars;inta;};///align42+2+1+3(null)+4*2=16structSZ6{charc[2];THREEt;ints;inta;};//sizeofofTHREE:3//sizeofofSZ:4//sizeofofSZ2:24//sizeofofSZ3:12//sizeofofSZ4:12//sizeofofSZ5:12//sizeofofSZ6:16
3,如果结构体里面有其他类型的数组,则:
最大对齐值是最大的基本类型
如果后面跟的是其他类型数组,直接拼接,即使超了。 如果后面跟的是基本类型,未超可以拼接。超了要补空对齐。
structTHREE{chara[3];};///align16+1=7structSZ{THREEt[2];chara;};///align88*2+8+8=32structSZ2{longc[2];THREEb[2];inta;};///align41+6+1(null)+4+4=16structSZ3{charc;THREEt[2];inti;shorts;};///如果基本类型下一个是其他类型,则直接拼接。///align4shouldbe:2+6+4+4=16structSZ4{charc[2];THREEt[2];shorts;inta;};///align88+3+6+1+4+2(null)=24structSZ5{longl;charc[3];THREEt[2];chars;inta;};///align88+6+2(null)+4+4(null)=24structSZ6{longl;THREEt[2];ints;};//sizeofofTHREE:3//sizeofofSZ:7//sizeofofSZ2:32//sizeofofSZ3:16//sizeofofSZ4:16//sizeofofSZ5:24//sizeofofSZ6:24
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。