字節(jié)對(duì)齊之struct大小計(jì)算方式


內(nèi)存對(duì)齊主要可以提高cpu的尋址訪問速度,以及方便在各平臺(tái)之間移植等作用。

下面介紹一下字節(jié)對(duì)齊后struct和union大小計(jì)算方式。舉例:

struct S1{
    short j; //2 bytes [0--1]
    double k; //8 bytes [8--15]
    char a[4]; //4 bytes [16--19]
    char c; //1 byte [20]
    int d; //4 bytes [24--27]
    //為了和double對(duì)齊,會(huì)自動(dòng)補(bǔ)齊到bouble的n倍.
};
struct S2{
    char i;// 1 byte [0]
    short o; //2 bytes [2--3]
    int k; //4 bytes [4--7]
    double b; //8 bytes [8--15]
};

union U1{
    char a[5]; //5 bytes
    int b[5]; //20 bytes
    double f; //8 bytes
};

int main(int argc, _TCHAR* argv[])
{
    int size1 = sizeof(S1);
    int size2 = sizeof(S2);
    int size3 = sizeof(U1);
    return 0;
}

計(jì)算結(jié)果如下

size1 = 32
size2 = 16
size3 = 24

為什么呢,不是應(yīng)該是19, 15, 20嗎? 不是的,原因是這樣的。

對(duì)于結(jié)構(gòu)體的計(jì)算要注意以下幾點(diǎn):

  1. 計(jì)算偏移量從0開始計(jì)算;
  2. 當(dāng)前元素的偏移從元素自身大小的整數(shù)倍開始計(jì)算。比如S1中K本身大小為8字節(jié),那就必須從8字節(jié)的整數(shù)倍開始偏移。比如S2中的K是4字節(jié)大小,那么它就應(yīng)該從4的整數(shù)倍開始偏移;
  3. 最后結(jié)果一定是結(jié)構(gòu)體中最大數(shù)據(jù)類型的整數(shù)倍;

對(duì)于Union的計(jì)算需要注意這幾點(diǎn):

  1. 計(jì)算各成員占用字節(jié)數(shù)的大小,占用最大字節(jié)數(shù)的成員記為x;
  2. 找出最大數(shù)據(jù)類型的成員所占字節(jié)數(shù)大小,記為y;
  3. 最后結(jié)果為n*y >= x.
    n*y就是最后的結(jié)果,n為最小值??梢岳斫鉃椋瑄nion的大小既能存放占用字節(jié)最大的數(shù)據(jù)成員,也能至少存放n個(gè)union中最大數(shù)據(jù)類型的成員。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 通過一段代碼來(lái)描述內(nèi)存對(duì)齊的現(xiàn)象。 上述代碼打印出來(lái)的結(jié)果為:24,16 為什么相同的結(jié)構(gòu)體,只是交換了變量 ab...
    豆瓣菜閱讀 7,028評(píng)論 5 26
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,697評(píng)論 18 399
  • 結(jié)構(gòu)體 在C語(yǔ)言中,可以使用結(jié)構(gòu)體(Struct)來(lái)存放一組不同類型的數(shù)據(jù)。結(jié)構(gòu)體的定義形式為: 結(jié)構(gòu)體是一種集合...
    Xiho丶閱讀 1,116評(píng)論 0 2
  • 4.3:新增class的相關(guān)內(nèi)容 今天看到一個(gè)題目: 最開始簡(jiǎn)單的理解為,每個(gè)數(shù)據(jù)的size之和就是偏移量。因?yàn)槠?..
    AwesomeAshe閱讀 982評(píng)論 0 0
  • 一天兩閨蜜聊著天,男的對(duì)女的說(shuō):現(xiàn)在的帥哥都是渣男,、女閨蜜怒氣沖沖地反駁說(shuō):哼,你怎么可以一棍子打翻一船人!,...
    燙了一嘴泡閱讀 702評(píng)論 0 0

友情鏈接更多精彩內(nèi)容