淺談結構體如何分配內存


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

(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位)

更多參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM