您好,登錄后才能下訂單哦!
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+4 struct SZ { char c[2]; int a; }; ///2+2+4=8 struct SZ2 { char c[2]; short b; int a; }; ///4+4+4=12 struct SZ3 { char c[2]; int a; short b; }; ///4+4+4=12 struct SZ4 { char c[6]; int a; };
結果:
sizeof of SZ:8
sizeof of SZ2:8
sizeof of SZ3:12
sizeof of SZ4:12
又這里基本類型最大是long,按8對齊。
///align8 8*2+8=24 struct SZ { long c[2]; int a; }; ///align8 8*2+8=24 struct SZ2 { long c[2]; short b; int a; }; ///align8 8+2*8+8+8=40 struct SZ3 { char c[2]; long a[2]; int b; int i; short s; }; ///align8 48+8=56 struct SZ4 { long c[6]; int a; };
sizeof of long:8
sizeof of SZ:24
sizeof of SZ2:24
sizeof of SZ3:40
sizeof of SZ4:56
2,如果class或struct里面有其他自定義類型。 如果基本類型跟的是其他類型,則直接拼接,即使超過對齊數
對齊值是基本類型的最大值。
struct THREE { char a[3]; }; ///align1 3+1=4 struct SZ { THREE t; char a; }; ///align8 8*2+8=24 struct SZ2 { long c[2]; THREE b; int a; }; ///align4 1+3 +4 +4 =12 struct SZ3 { char c; THREE t; int i; short s; }; ///如果基本類型下一個是其他類型,則直接拼接不用對齊。 /// align4 not 4+4+4+4=16 //err ///align4 should be: 2+2 +1+2+1(null) +4 =12 struct SZ4 { char c[2]; THREE t; short s; int a; }; ///align4 2+2 +1+1+2(null) +4=12 struct SZ5 { char c[2]; THREE t; char s; int a; }; ///align4 2+2 +1+3(null) +4*2 =16 struct SZ6 { char c[2]; THREE t; int s; int a; }; //sizeof of THREE:3 //sizeof of SZ:4 //sizeof of SZ2:24 //sizeof of SZ3:12 //sizeof of SZ4:12 //sizeof of SZ5:12 //sizeof of SZ6:16
3,如果結構體里面有其他類型的數組,則:
最大對齊值是最大的基本類型
如果后面跟的是其他類型數組,直接拼接,即使超了。 如果后面跟的是基本類型,未超可以拼接。超了要補空對齊。
struct THREE { char a[3]; }; ///align1 6+1=7 struct SZ { THREE t[2]; char a; }; ///align8 8*2+8+8=32 struct SZ2 { long c[2]; THREE b[2]; int a; }; ///align4 1+6+1(null)+4+4=16 struct SZ3 { char c; THREE t[2]; int i; short s; }; ///如果基本類型下一個是其他類型,則直接拼接。 ///align4 should be: 2+6 +4 +4 =16 struct SZ4 { char c[2]; THREE t[2]; short s; int a; }; ///align8 8+ 3+6+1+4+2(null) =24 struct SZ5 { long l; char c[3]; THREE t[2]; char s; int a; }; ///align8 8+6+2(null) +4+4(null) =24 struct SZ6 { long l; THREE t[2]; int s; }; //sizeof of THREE:3 //sizeof of SZ:7 //sizeof of SZ2:32 //sizeof of SZ3:16 //sizeof of SZ4:16 //sizeof of SZ5:24 //sizeof of SZ6:24
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。