結構體的記憶體分配

2021-06-19 01:54:39 字數 1833 閱讀 9587

記憶體大小和系統有關,如32位系統和64位系統,同一資料型別,記憶體分配大小不一

假設這台機器是sizeof(char)=1  sizeof(int)=4 sizeof(double)=8

列舉型別只為最寬的資料分配記憶體,在不同的時候,用的是同一塊記憶體;在預設情況下,規定各成員變數的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的位元組數的倍數。下面列出常用型別的對齊方式(32位系統),變數存放的起始位址相對於結構的起始位址的偏移量。

1、char偏移量必須為sizeof(char)即1的倍數

2、short偏移量必須為sizeof(short)即2的倍數

3、int偏移量必須為sizeof(int)即4的倍數

4、float偏移量必須為sizeof(float)即4的倍數

5、double偏移量比較特殊,sizeof(double)=8,但是偏移量是4

各成員變數在存放的時候根據在結構體中出現的順序依次申請空間,同時按照上面的對齊方式調整位置。空缺的位元組會自動填充,同時為了確保結構的大小為結構的位元組邊界數(即結構體中佔偏移量最大的型別所占用的位元組數)的倍數,所以在為最後乙個成員變數申請空間後,還會根據需要自動填充空缺的位元組。

結構體的記憶體分配依賴於結構成員的型別:

1、struct s

第乙個成員偏移量為0,是4的倍數,所以可以為其分配四個位元組的空間

第二個成員偏移量為4,是1的倍數,所以可以為其分配1個位元組的空間,現在結構體的大小應該是5(4+1)

但是結構體的總大小為結構體最寬基本資料成員大小的整數倍,如有需要編譯器會再最末乙個成員之後加上填充位元組,所以編譯器會在後面填充3個位元組,因此結構體的實際大小sizeof(struct s)=8

再看結構體struct s

由於成員c相對於相對於結構體的偏移量為4,現在結構體大小是5(4+1),那麼成員d的偏移量就應該是5,不是8的倍數,會在成員c之後填充3個位元組,以使d的偏移量達到8的整數倍,然後d分配8個位元組,因此現在結構體的大小是16,是最大型別位元組數的整數倍。

struct s的大小為20.注意double大小是8,偏移量是4

2、struct s1的大小為28=1+3+20+1+3

1)、結構體變數的首位址能夠被其最大偏移量型別成員的偏移量整除

2)、結構體每個成員相對於結構體首位址的偏移量都是成員偏移量的整數倍,如有需要編譯器會在成員之間加上填充位元組

3)、結構體的總大小為結構體最大偏移量型別成員的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組

3、下面做一些補充:

1、什麼是位元組對齊,為什麼要對齊

現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但是實際情況是在訪問特定型別變數的時候經常在特定的記憶體定製訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。

對齊的作用和原因:各個硬體平台對儲存空間的處理上又很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。比如有些架構的cpu在訪問乙個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下變成必須保證位元組對齊。但是最常見的如果不按照適合其平台要求對資料存放進行對齊,會在訪問效率上帶來損失。

2、編譯器是按照什麼樣的原則進行對齊的?

先了解4個重要的基本概念:

1、資料型別自身的對齊值

對char資料型別,其自身對齊值為1,對於short型為2,對int, float, double型別,其自身對齊值為4,單位為位元組

2、結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值

3、指定對齊值:#pragma pack(value)時的指定對齊值value

4、資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中小得那個值

結構體的記憶體分配

假設這台機器 sizeof char 1 sizeof int 4 sizeof double 8 列舉型別只為最寬的資料分配記憶體,在不同是時候,用的是同一塊記憶體 在預設情況下,vc規定各成員變數存放的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的 位元組數的倍數。下面列出常用型...

結構體的記憶體分配

假設這台機器 sizeof char 1 sizeof int 4 sizeof double 8 列舉型別只為最寬的資料分配記憶體,在不同是時候,用的是同一塊記憶體 在預設情況下,vc規定各成員變數存放的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的 位元組數的倍數。下面列出常用型...

共用體結構體的記憶體分配

共用體表示幾個變數共用乙個記憶體位置,在不同的時間儲存不同的資料型別和不同長度的變數。在union中,所有的共用體成員共用乙個空間,並且同一時間只能儲存其中乙個 成員變數 的值。下例表示宣告乙個共用體foo union foo 再用已宣告的共用體可定義共用體變數。例如用上面說明的共用體定義乙個名為b...