如何計算一個結構體所佔內存空間大小

以示例說明:

例1:

struct myStruct {
    double a;  //8個字節
    char b;  //1個字節
    int c;  //4個字節
};

以n代表內存空間
第一步:8 % 1 = 0, n = 8 + 1 = 9;
第二步:9 % 4 ≠ 0,n = 9 + 3 =12, 12 % 4 = 0,n = 12 + 4 = 16;
第三步:16 % 8 = 0;
那麼該結構體大小爲16個字節。

注:由於9不能被4整出,所以加上3(只能加不能減1)得到離9最近的能夠被4整除的數爲12。

例2:

struct myStruct {
    short a;  //2個字節
    double b;  //8個字節
    int c;  //4個字節
};

以n代表內存空間
第一步:2 % 8 ≠ 0, n = 2 + 6 = 8, 8 % 8 = 0, n = 8 + 8 =16;
第二步:16 % 4 = 0, n = 16 + 4 = 20;
第三步:20 % 8 ≠ 0, n = 20 + 4 = 24;
那麼該結構體大小爲24個字節。

注:第一步的第三個8是2+6得到的;第三步由於20不能被最大類型所佔字節的整除,所以需要加上4得到離20最近的能被8整除的數24。

說明:這是C語言編譯器對變量存儲的一個特殊處理。爲了提高CPU的從存儲速度,C編譯器對一些變量的起始地址做了“對齊”處理。在默認情況下,編譯器規定各成員變量存放的起始地址相對於結構的起始地址的偏移量必須爲該變量的類型所佔用的字節數的倍數;且結構的大小爲結構的字節邊界數(即該結構體中佔用最大空間的類型所佔用的字節數)的倍數。

發佈了20 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章