1. 程式人生 > >C語言結構體大小計算

C語言結構體大小計算

定義

結構體中的偏移量

結構體中的偏移量是一個成員的實際地址和結構體首地址之間的距離。

結構體大小計算

結構體大小 會涉及到位元組對齊(目的是 讓計算機快速讀寫 以空間換取時間)。即,最後一個成員的偏移量加上最後一個成員的大小再加上末尾的填充位元組數。

結構體內偏移規則

1、每個成員的偏移量都必須是當前成員所佔記憶體大小的整數倍如果不是編譯器會在成員之間加上填充位元組。
2、當所有成員大小計算完畢後,編譯器判斷當前結構體大小是否是結構體中最寬的成員變數大小的整數倍 如果不是會在最後一個成員後做位元組填充。

struct unknown {
    int
a; char b; int c; long d; char e; }; printf("%lu\n", sizeof(struct unknown)); //output : 32

結構體重共有一個long型別,兩個char型別,兩個int型別成員。如果只按照這幾個成員大小相加,結構體大小應該是 8 + 2 * 4 + 2 * 1 = 18 個位元組大小。但實際上該結構體是32個位元組大小。

下面來一步步分析編譯器是如何計算大小進行分配的。(以下未標明單位的數字以位元組為單位)

1、遇到第一個成員變數a,該成員偏移量為0,大小為4,符合偏移規則第一條。
2、接下來第二個成員變數b,偏移量為4,大小為1,符合偏移規則第一條。
3、成員變數c,偏移量為5,大小為4,不符合偏移規則第一條。在成員b和c之間填充三個位元組,此時,偏移量大小為8,符合偏移規則第一條,繼續往下。
4、成員變數d,偏移量為12,大小為8,不符合偏移規則第一條,在成員c和d之間填充4個位元組,此時偏移量為16,符合偏移規則第一條,繼續往下。
5、成員變數e,偏移量為24,大小為1,符合偏移規則第一條。
6、所有成員大小計算完後,執行偏移規則第二條,最寬的型別是d,long型別,8個位元組,當前結構體計算出的大小為25,並不符合第二條規則,於是在末尾填充7個位元組,總大小為32個位元組,滿足第二條偏移規則。到此結構體大小計算結束。