C語言中結構體大小的計算(記憶體對齊詳解)

2021-08-17 12:25:20 字數 1209 閱讀 4817

首先來看乙個例子;

struct s

;

我們先來計算一下這個結構體的大小,如果不存在記憶體對齊這個問題,按理說這個結構體應該佔(1+4+1)6個位元組;然而事實上它佔了12個位元組,為什麼?我們需要解決下面幾個問題。

###看上面的圖 ##

利用這四個規則就可以計算結構體的大小。這時參照上面的圖中第二種情況來計算,對於上面的結構體,先定義了char型別的 a ,規則1說第乙個元素在偏移量為0的位址處,即它對齊到0號位址處的位置,其佔乙個位元組;第二個元素要對齊到自己對齊數的整數倍處,因為第二個元素的大小為int型,佔4個位元組,而vs預設對齊數是8,取最小的數,所以 b 的對齊數為4,規則2說要對其自身對齊數(4)的整數倍,而此時 a 佔了乙個位元組,下個位址依次為2、 3 、4等,當走到4號位址處時,此時4能被4整除,所以第二個元素對齊在4號下標的位址處,占用4個字;接下來,第三個元素為char型別的 c ,c的大小為1,和8比較取小的數,所以 c 的對齊數為1,而此時 b 存放完之後的下個位址為9號位址,根據規則2,9是1的整數倍,所以 c 直接存放在9號開頭的位址處。接下來,計算它們的大小,分別為1(char)+3(偏移量)+4(int)+1(char)=9,而正確的結果為12,原因在於規則3,規則3規定結構體的總大小為最大對齊數的整數倍,上面的3個元素中,它們的對齊數分別為0、4、1。所以最大對齊數為4,而結構體大小要整除最大對齊數,剛才計算出結構體的大小為9,很明顯不能整除,所以結構體的大小為1(char)+3(偏移量)+4(int)+1(char)+3(偏移量)=12。

###再來看第二個例子 ##

struct s1

;struct s2

;

首先計算出結構體s1的大小為1(char)+1(char)+2(偏移量)+4(int)=8,s1的對齊數就是其結構體成員中最大的對齊數,即4,在結構體s2中,對齊數分別是0、4、8;首先 c1 對齊在0號位址的位置,其占用1個位元組,根據規則4,巢狀的結構體s1要對齊到自身對齊數4的整數倍處,所以此時結構體對其在4號位址處,其大小是8個位元組,之後,d 的對齊數為8,所以它要對齊到16號位址處,所以此時計算出s2的大小是1(char)+3(偏移量)+8(struct s1)+4(偏移量)+8(double)=24,結構體s2中個成員的對齊數分別為0、4、8,因為24是8的倍數,符合規則4。所以s2的總大小就是24個位元組。

#pragma pack(n) 表示設定為n位元組對齊。

C語言中結構體占用記憶體大小

這個問題很經典,很容易出現,也叫記憶體的4k對齊吧 cpu傳輸資料的方式 cpu每次傳輸資料大小由它的總線條數決定,32位傳輸4個位元組,64位傳輸8個位元組。這裡以64位系統舉例,若宣告乙個變數大小為8位元組,起始位址位1,而cpu讀取的位址為0 7,則該變數需要讀取兩次,顯然降低了cpu的效能。...

C語言中的結構體大小

現代計算機中,記憶體空間按照位元組劃分,理論上可以從任何起始位址訪問任意型別的變數。但實際中在訪問特定型別變數時經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序乙個接乙個地存放,這就是對齊。不同硬體平台對儲存空間的處理上存在很大的不同。某些平台對特定型別的資料只...

C語言 計算結構體大小

結構體中的成員可以是不同的資料型別,成員按照定義時間的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對其問題。結構體對齊規則 通入下面例題,計算結構體大小 題1 struct s1 題2 struct s2 題3 st...