溫馨提示×

溫馨提示×

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

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

結(jié)構(gòu)體嵌套對齊

發(fā)布時間:2020-06-27 15:12:04 來源:網(wǎng)絡 閱讀:1236 作者:pingglala 欄目:開發(fā)技術(shù)

64 位的優(yōu)點:64 位的應用程序可以直接訪問 4EB 的內(nèi)存和文件大小最大達到4 EB(2 的 63 次冪);可以訪問大型數(shù)據(jù)庫。本文介紹的是64位下C語言開發(fā)程序注意事項。


1. 32 位和 64 位C數(shù)據(jù)類型

32和64位C語言內(nèi)置數(shù)據(jù)類型,如下表所示:

結(jié)構(gòu)體嵌套對齊

上表中第一行的大寫字母和數(shù)字含義如下所示:
I表示:int類型
L表示:long類型
P表示:pointer指針類型
32表示:32位系統(tǒng)
64表示64位系統(tǒng)

如:LP64表示,在64位系統(tǒng)下的long類型和pointer類型長度為64位。
64位Linux 使用了 LP64 標準,即:long類型和pointer類型長度為64位,其他類型的長度和32位系統(tǒng)下相同類型的長度相同,32位和64位下類型的長度比較見上圖的藍色部分。
下圖為在32和64位linux系統(tǒng)下使用sizeof檢測出的數(shù)據(jù)類型的長度。
32位平臺下結(jié)果:

結(jié)構(gòu)體嵌套對齊

64位平臺下結(jié)果:

結(jié)構(gòu)體嵌套對齊



主流都是64位了。所以都按照64位的來。


sizeof對齊問題。

1,如果class或struct里面有基本類型數(shù)組,則數(shù)組應該按照結(jié)構(gòu)體對齊值的倍數(shù)對齊。

而結(jié)構(gòu)體對齊值應該是基本變量的最大值,這里是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;
};

結(jié)果:

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里面有其他自定義類型。 如果基本類型跟的是其他類型,則直接拼接,即使超過對齊數(shù)

對齊值是基本類型的最大值。

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,如果結(jié)構(gòu)體里面有其他類型的數(shù)組,則:

最大對齊值是最大的基本類型

如果后面跟的是其他類型數(shù)組,直接拼接,即使超了。   如果后面跟的是基本類型,未超可以拼接。超了要補空對齊。

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問一下細節(jié)

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

AI