91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

結構體嵌套對齊

發布時間:2020-06-27 15:12:04 來源:網絡 閱讀:1236 作者:pingglala 欄目:開發技術

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瓦房店市| 九江市| 苍山县| 克东县| 枣庄市| 彰武县| 山东| 比如县| 淳安县| 合水县| 邵阳市| 泗洪县| 陆丰市| 西吉县| 崇仁县| 兴海县| 泰来县| 云和县| 类乌齐县| 盖州市| 满洲里市| 舟山市| 铁岭县| 江阴市| 浦城县| 南安市| 佳木斯市| 鄂托克旗| 乌拉特后旗| 三原县| 揭西县| 上高县| 延寿县| 宜兰县| 沐川县| 驻马店市| 三门峡市| 额尔古纳市| 新和县| 团风县| 若羌县|