結(jié)構(gòu)體嵌套對齊-創(chuàng)新互聯(lián)

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

成都創(chuàng)新互聯(lián)公司主營武邑網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā),武邑h5小程序制作搭建,武邑網(wǎng)站營銷推廣歡迎武邑等地區(qū)企業(yè)咨詢

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 標(biāo)準(zhǔn),即:long類型和pointer類型長度為64位,其他類型的長度和32位系統(tǒng)下相同類型的長度相同,32位和64位下類型的長度比較見上圖的藍(lán)色部分。
下圖為在32和64位linux系統(tǒng)下使用sizeof檢測出的數(shù)據(jù)類型的長度。
32位平臺(tái)下結(jié)果:

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

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

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

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

sizeof對齊問題。

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

而結(jié)構(gòu)體對齊值應(yīng)該是基本變量的大值,這里是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;
};
///如果基本類型下一個(gè)是其他類型,則直接拼接不用對齊。
/// 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ù)組,直接拼接,即使超了。  如果后面跟的是基本類型,未超可以拼接。超了要補(bǔ)空對齊。

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;
};
///如果基本類型下一個(gè)是其他類型,則直接拼接。
///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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

文章名稱:結(jié)構(gòu)體嵌套對齊-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://muchs.cn/article0/cddoio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)品牌網(wǎng)站制作、網(wǎng)站導(dǎo)航、建站公司云服務(wù)器、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司