真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

結(jié)構(gòu)體大小的計(jì)算以及內(nèi)存對(duì)其原則和修改默認(rèn)對(duì)齊數(shù)-創(chuàng)新互聯(lián)

1.結(jié)構(gòu)體大小的計(jì)算

   **我們都知道,不論是數(shù)組還是指針都可以計(jì)算其大小,
             而同樣結(jié)構(gòu)體也是可以計(jì)算大小的,
             接下來我們就深入討論如何計(jì)算結(jié)構(gòu)體的大小。**

#include
#includ
struct s1
{
    char c1;
    int a;
    char c2;

};

int main()
{
    printf("%d\n", sizeof(struct s1));
    system("pause");
    return 0;
}

大家猜猜這個(gè)求出來的結(jié)果多大呢,

創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)龍江,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

話不多說,直接上結(jié)果圖;
結(jié)構(gòu)體大小的計(jì)算以及內(nèi)存對(duì)其原則和修改默認(rèn)對(duì)齊數(shù)

是不是很疑惑呢,下面我就講一講結(jié)構(gòu)體的大小怎么計(jì)算。
在這之前,我們先了解一個(gè)概念

2.結(jié)構(gòu)體的內(nèi)存對(duì)齊

首先內(nèi)存對(duì)齊有以下幾條規(guī)則

1.第一個(gè)成員在與結(jié)構(gòu)體變量偏移量為0的地址處 (其實(shí)說白了就是和第一個(gè)成員變量的地址一樣,就是從第一個(gè)成員變量的地址開始計(jì)算);
2.其他成員變量要對(duì)齊到某個(gè)數(shù)字(對(duì)齊數(shù))的整數(shù)倍的地址處;
對(duì)齊數(shù)=min{編譯器默認(rèn)的一個(gè)數(shù),該成員的大小};
一般呢,vs中默認(rèn)值=8,linux中默認(rèn)值=4;
3.結(jié)構(gòu)體總大小就為大對(duì)齊數(shù)的整數(shù)倍,
!!每一個(gè)成員變量都有一個(gè)對(duì)齊數(shù)!!
4.如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對(duì)齊到自己的大對(duì)齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有對(duì)齊數(shù)(含嵌套結(jié)構(gòu)體的對(duì)齊數(shù))的整數(shù)倍。

下面我就分析一些具體的實(shí)例來幫大家理解;

#include
#includ
struct s1
{
    char c1;     //min{1,8}=1
    int a;          //min{4,8}=4
    char c2;     //min{1,8}=1

};

int main()
{
    printf("%d\n", sizeof(struct s1));
    system("pause");
    return 0;
}

在剛剛這個(gè)例子中 他們的對(duì)齊數(shù)分別是1,4,1
首先在內(nèi)存中找一個(gè)位置放入第一個(gè)成員變量,也就是c1;=>對(duì)應(yīng)規(guī)則1
然后下一個(gè)成員變量的對(duì)齊數(shù)為4,所以存放這個(gè)成員變量的時(shí)候他的首地址應(yīng)該放在4的整數(shù)倍處;=>對(duì)應(yīng)規(guī)則2
然后最后一個(gè)是c2,他的對(duì)齊數(shù)是1,就緊接著放,可能有的同學(xué)覺得到這就結(jié)束了,但其實(shí)并不是,c2放完了以后,后邊的三個(gè)字節(jié)也需要算上,而這么做的原因就要追溯到
=>規(guī)則3
所以最后就是12個(gè)字節(jié)的大小啦。
詳情圖解如下:
結(jié)構(gòu)體大小的計(jì)算以及內(nèi)存對(duì)其原則和修改默認(rèn)對(duì)齊數(shù)

看了上面的例子我想著大家可能已經(jīng)了解如何計(jì)算結(jié)構(gòu)體的大小,
那么大家看一看下面的這個(gè)例子,

#include
#includ
struct s2
{
    char q1;
    char q2;
    int i;

};

int main()
{
    printf("%d\n", sizeof(struct s2));
    system("pause");
    return 0;
}

結(jié)構(gòu)體大小的計(jì)算以及內(nèi)存對(duì)其原則和修改默認(rèn)對(duì)齊數(shù)

不知道大家有沒有發(fā)現(xiàn)這個(gè)例子和第一個(gè)例子是其實(shí)結(jié)構(gòu)體成員都是一樣的,只是順序不一樣,我還是用圖來給大家講解一下。
結(jié)構(gòu)體大小的計(jì)算以及內(nèi)存對(duì)其原則和修改默認(rèn)對(duì)齊數(shù)

這里先放q1,占用一個(gè)字節(jié),然后q2的對(duì)齊數(shù)也是1,則緊接著放,占用一個(gè)字節(jié),i的對(duì)齊數(shù)為4,則i的首地址要放在4的倍數(shù)處,則從偏移量為4處開始放起,放完后一共8個(gè)字節(jié),同樣也是大對(duì)齊數(shù)(4)的倍數(shù),就是這個(gè)結(jié)構(gòu)體的大小。

通過這兩個(gè)例子,我們就需要想一想,在設(shè)計(jì)結(jié)構(gòu)體時(shí),怎樣才能滿足既要內(nèi)存對(duì)齊,又要節(jié)省空間呢,那就是 !!盡可能讓占用空間小的成員集中在一起。

看完這兩個(gè)例子,我想大家都已經(jīng)理解并且學(xué)會(huì)結(jié)構(gòu)體大小的計(jì)算了吧,那么下面我們算一個(gè)結(jié)構(gòu)體嵌套的大小。

#include
#includ
struct  s3
{
    double a;
    char b;
    int c;
};

struct s4
{
    char d;
    struct s3 e;
    double f;
};

int main()
{
    printf("%d\n", sizeof(struct s3));
    printf("%d\n", sizeof(struct s4));
    system("pause");
    return 0;
}

結(jié)構(gòu)體大小的計(jì)算以及內(nèi)存對(duì)其原則和修改默認(rèn)對(duì)齊數(shù)

大家會(huì)不會(huì)算呢,
在有結(jié)構(gòu)體嵌套問題的時(shí)候,記得嵌套的結(jié)構(gòu)體對(duì)齊到自己的大對(duì)齊數(shù)的整數(shù)倍處哦,而結(jié)構(gòu)體的整體大小就是所有大對(duì)齊數(shù)(含嵌套結(jié)構(gòu)體的對(duì)齊數(shù))的整數(shù)倍。

那到這可能有的人要好奇為什么要存在內(nèi)存對(duì)齊呢,其原因有兩點(diǎn):
1.平臺(tái)原因(移植原因):不是所有的硬件平臺(tái)都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
2.性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能地在自然邊界上對(duì)齊。原因在于,為了訪問未對(duì)齊的內(nèi)存,處理器需要做兩次內(nèi)存訪問;而對(duì)齊的內(nèi)存訪問僅需要一次訪問。

其實(shí)說白了就是用空間來?yè)Q取時(shí)間是的做法

3.修改默認(rèn)對(duì)齊數(shù)

最后我們?cè)僦v一個(gè)知識(shí)點(diǎn),就是修改默認(rèn)的對(duì)齊數(shù);用的是#pragma這個(gè)預(yù)處理指令;

#include
#includ
#pragma pack(1)  //設(shè)置默認(rèn)對(duì)齊數(shù)為6
struct s5
{
    char a1;
    int i1;
    char a2;

};
#pragma pack()//取消設(shè)置的默認(rèn)對(duì)齊數(shù),還原為vs自己默認(rèn)的對(duì)齊數(shù)值
int main()
{
    printf("%d\n", sizeof(struct s5));
    system("pause");
    return 0;
}

結(jié)構(gòu)體大小的計(jì)算以及內(nèi)存對(duì)其原則和修改默認(rèn)對(duì)齊數(shù)

這個(gè)計(jì)算方法和上面的一模一樣,就是默認(rèn)對(duì)齊數(shù)改變了而已。

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


當(dāng)前文章:結(jié)構(gòu)體大小的計(jì)算以及內(nèi)存對(duì)其原則和修改默認(rèn)對(duì)齊數(shù)-創(chuàng)新互聯(lián)
URL鏈接:http://weahome.cn/article/codcss.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部