結構體的記憶體分配機制

2022-06-25 19:42:13 字數 1994 閱讀 9966

首先,結構在c語言中也是一種資料型別,叫做聚組型別(還包括陣列)。他和其他的資料型別是一樣的,在定義乙個結構體的時候,系統並不會為他真正的分配記憶體空間(定義的結構體變數要在編譯的階段才分配空間,而結構體指標要顯示的使用malloca來分配空間),也就是說,在定義結構體這種資料型別的時候是不會分配記憶體空間的,只有在定義變數的時候,才會分配。

1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

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

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

下面是來自《c和指標》的介紹

struct s1;

首先,結構體在儲存的時候,結構體的首位址必須能夠被其中最寬資料型別整除。(在s1中,最寬資料型別為int,在32位系統中為4byte),

其次,參照第二條,第乙個資料時char(已經保證了,結構的起始位址是4的整數倍),儲存乙個char,佔乙個byte,要保證下乙個int的儲存起始位址是4的整數倍,所以要在char後面填充三個byte,然後在儲存第三個資料。

第三,最後乙個也是char型別,他就佔乙個byte,肯定是他儲存位置的整數倍,最後參照第三條,結構體的總大小為最寬資料型別的整數倍,所以會在第二個char之後再填充三個byte。

這樣的話,總共佔據的空間是1+3+4+1+3 = 12(紅色為填充字元)

【但是】,調換一下結構中資料成員的順序

struct s1;

同樣地分析4+1+1+2 = 8

相比之下,儲存空間的效率提高33%。

以下是系統對結構體的記憶體分配的詳細介紹:

1、結構體變數的首位址是結構體中最寬資料型別的整數倍。

編譯器在給結構體開闢空間時,首先找到結構體中最寬的基本資料型別,然後尋找記憶體位址能是該基本資料型別的整倍的位置,作為結構體的首位址。

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

為結構體的乙個成員開闢空間之前,編譯器首先檢查預開闢空間的首位址相對於結構體首位址的偏移是否是本成員的整數倍,若是,則存放本成員,反之,則在本成員和上乙個成員之間填充一定的位元組,以達到整數倍的要求,也就是將預開闢空間的首位址後移幾個位元組。

3、結構體的總大小為結構體中最寬基本資料成員的整數倍。如有需要,編譯器將會在結構體的新增填充字元。

4、結構體中的資料成員按照所佔空間從大到小的順序來排列的話,這樣儲存空間就會得以提高。

4、現在對四條進行修正。在組織資料結構的資料成員的時候,可以將相同型別的成員放在一起,這樣就減少了編譯器為了對齊而新增的填充字元。

【提示】:

有些時候,我們不應該對結構的資料成員進行重排以減少因對齊帶來的空間損失。因為在我們對資料成員重拍的時候,往往破壞了資料間的關聯性,從而降低了程式的可讀性和可維護性。

綜上,我們可以得出,在對結構的成員進行重排的時候,即要考慮儲存空間的使用效率,又要考慮程式的可讀性與可維護性。

下面的**是對上述幾條的驗證:

#include

#include

struct s1;

struct s2 ;

int main()

1 #include2 #include3 struct s1;

8 9 struct s2 ;

15 int main()

C C 記憶體分配機制

1.c語言中的記憶體機制 在c語言中,記憶體主要分為如下5個儲存區 1 棧 stack 位於函式內的區域性變數 包括函式實參 由編譯器負責分配釋放,函式結束,棧變數失效。2 堆 heap 由程式設計師用malloc calloc realloc分配,free釋放。如果程式設計師忘記free了,則會造...

memcached記憶體分配機制

memcached slab allocator分配機制 slab allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊,以完全解決記憶體碎片問題。slab allocation的原理相當簡單,就是將分配的記憶體分割成各種尺寸的塊 chunk 並把尺寸相同的塊分成組 c...

Memcache記憶體分配機制

1.page 頁 為記憶體分配的最小單位 memcached 的記憶體分配以page為單位,預設情況下乙個page是1m,可以通過 i引數在啟動時指定。如果需要申請記憶體時,memcached會劃分出乙個新的page並分配給需要的slab區域。page一旦被分配在重啟前不會被 或者重新分配 2.sl...