1. 程式人生 > >淺談結構體如何分配記憶體

淺談結構體如何分配記憶體

下面直接以例子進行說明:

(1)先是定義瞭如下結構體:

struct{
    char a;
     int i;
    double d;
    }text;

然後用sizeof(text),預期結果是1+2+8 = 11???如果這樣想就錯了,答案是16.

(2)然後,換一下變數的順序:

struct{
    char a;
    double d;
    int i;
   }text;

猜猜答案是多少?11?16?錯,答案是24.

(3)再換個順序:

struct{
    double d;
    char a;
    int i;
    }text;

又開始猜答案了,11?16?24?這次終於蒙對了,答案是16.

同一個結構體,就是變數順序的不同,為什麼大小會有如此大的差別,原因在於:

在儲存過程中,為了提高CPU的儲存速度,編譯器會對變數的起始地址做“對齊”處理。VC規定結構體的各變數存放的起始地址相對於結構體的起始地址的偏移量必須是該變數的型別所佔位元組數的倍數,並且整個結構體的位元組數必須是該結構體中佔用空間最大的型別的位元組數的整數倍。所以上述3個結構體實際分配情況如下:

(1)1000 1111 11111111(0表示補充位)

首先,為char型別的a分配,由於是第一個,相當於起始地址是0,是sizeof(char)的整數倍,分配一位;接著,為int型別的i分配,其位元組數是4,與起始地址的偏移量是1,不是4的整數倍,於是補充3個填充位,再為i分配4位;最後,為double型別的d分配,其位元組數是8,與起始地址的偏移量是8,剛好是整數倍,於是接著分配8位,整個結構體就佔16位。

(2)1 0000000 11111111 1111 0000 (由於20不是8的整數倍,最後還會補充4位,共計24位)

(3)11111111 1000 1111(共計16位)

更多參考