C語言計算結構體占用位元組大小總數

2021-10-03 15:28:15 字數 1063 閱讀 1654

在學習c語言的時候很多人可能遇到了和我同樣的問題,就是無法正確計算出c語言結構體所佔位元組的總的大小。首先,在開始計算結構體占用位元組大小之前,我們要先搞懂什麼是結構體的對齊和補齊。為什麼會有結構體的對齊與補齊。

cpu的資料傳輸方式:

cpu的資料傳輸方式是一次傳輸2個(32位)或者8個(64位)位元組的方式進行傳輸(根據總線條數來確定),這裡我們以64位系統來舉例,如果你宣告乙個變數占用8個位元組,且該變數的起始位址是1,由於cpu一次讀取8個位元組,讀取位元組的位址是從0到8,那麼cpu要得到該變數的值,需要讀取兩次,降低了cpu的效能。為了提高cpu讀取的效能和效率,採取了補齊的方法來優化cpu的執行效率。也就是說,你宣告的8個位元組的變數,一定會被cpu一次性讀取,即改變量的初始位址,一定是從0開始,如果上乙個變數不滿足8位元組,會自動被補齊來保證下乙個位元組的其實位址為cpu讀取的初始位址。

補齊和對齊:

為了保證cpu每次在讀取乙個變數的時候都是從初始位址開始的,所以,將不滿足8位元組大小的變數進行補全。

下面我們來看幾個例子:

struct a

;struct b

;struct c

;struct d

;

結構體a記憶體分配:

對char a分配乙個位元組,但是由於要與double補齊,所以,需要給char a新增7個補位,保證與double補齊。當系統給 int分配記憶體的時候,需要給double補齊,所以,也分配了8個字元,但是int實際占用4個位元組,剩餘都是補位。所以總共有24個位元組。

結構體b記憶體分配:

double b分配8個位元組,為了補齊int也分配8個位元組,由於int實際占用4個位元組,剩餘都是補位,且剩餘的位元組數可以裝下char型別位元組,所以,char就不需要分配記憶體,即總共16個位元組。

c和d也是一樣道理,總共16個位元組。

再如:

struct

為了與float補齊,需要4+4=8個位元組。

因此,計算結構體大小時需要考慮其記憶體布局,結構體在記憶體中存放是按單元存放的,每個單元多大取決於結構體中最大基本型別的大小。

C語言資料型別占用位元組大小

在昨天的筆試的時候碰到了乙個關於不同的資料型別占用位元組大小的問題,於是就想歸納整理一下關於這方面的問題。於是就寫了一下,在linux系統下用gcc編譯驗證了一下,以供參考。16位編譯器 char unsigned char 1位元組 char 2位元組 short int 2位元組 int uns...

C語言 計算結構體大小

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

C語言 結構體內存對齊(計算結構體占用的位元組數)

struct s 如果不考慮或者不存在記憶體對齊問題,這個結構體應該佔1 4 1 6個位元組,然而事實上它佔了12個位元組,這就涉及到記憶體對齊問題了。結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間,和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考...