C語言結構體內存對齊規律自我總結

2021-10-23 17:01:11 字數 1251 閱讀 3303

如果有其他學習者已有一定理解,但是對某些地方還是有些疑惑,或許可以看懂我所寫—主要為了自己總結複習–如有錯誤方便再改)

前要知識:

cpu一次效能讀取資料的二進位制位數稱為字長,乙個位元組=8位。

那麼32位處理器可以一次性最大處理4個位元組的資料量。

我們這裡討論的也是在32位計算機中,明白後可以按規律推廣至64位計算機。

那麼在結構體中就需要注意,

如果結構體型別中包含有某個結構體成員,它的型別所佔位元組數是等於4的,例如4位元組的整型

那麼必須保證cpu一次就能把這四個位元組全部讀取。即讀取的時候在整型的起始位址的邊界開始讀取,就可以一次性確保讀取4個位元組成功。

設想如果,並不是在整型的邊界讀取資料的話, 那麼它將會被分二次讀取,才能讀取完整這個整型所包含的所有資料。 這時候cpu還需額外的操作將分二次讀取的資料整合在一起,降低了系統效能。

切入正題:(32位計算機中)

首先: 找到所在結構體所有成員當中----所佔位元組數最大的那個型別的成員.

例:如果最大型別成員是int(4位元組) 的情況

那麼需要保證永遠可以在int記憶體起始位址邊界位置讀取資料

例:如果最大型別成員是int 的情況

struct temp

;

此為記憶體圖示, [a][b][x][x][c][c][c][c] 共佔8位元組

[x]代表記憶體補位; 補位以達到,cpu讀取時,可以通過一次讀取, 讀取乙個整型的所有資料.

例:如果最大型別成員是short(2位元組) 的情況

那麼需要保證永遠可以在short記憶體起始位址邊界位置讀取資料

struct temp

;

此為記憶體圖示, [a][x][b][b][c][x] 共佔6位元組

對於結構體中最大成員型別所佔是2個位元組的short情況下

需注意, 對於32位計算機不是說我每次一定要讀滿4個位元組, 是代表一次讀取時可以小於等於4個位元組資料. 但是不能超過4個位元組的資料.

short 最大型別情況下, 那麼以每次讀取2個位元組來判斷結構體內存所佔位元組的標準, 也就是通過補位達到

cpu讀取時,可以通過一次讀取, 讀取乙個short的所有資料.

總結: 以結構體成員型別所佔位元組數最大的那個成員為判別標準, 使 cpu讀取時,總是可以通過一次讀取, 就讀取乙個該型別的所有資料.

C語言結構體內存對齊

1.效能原因 為了提高cup的效率訪問記憶體的速度,若是訪問未對齊的記憶體,處理器需要作兩次訪問 而訪問對齊的記憶體,則只需要一次訪問。2.編譯器相關 有的編譯器已經優化了記憶體對齊,所以記憶體對齊依賴於編譯器。參考 結構體對齊問題 說實話,規則看起來不太好理解,直接模仿下面步驟即可 以32位機器為...

C語言結構體內存對齊

記憶體中存放資料的時候要有一定的規則,這麼做得根本原因是要減少cpu訪問記憶體的次數。舉個例子,int型別為4個位元組,存放int型別的記憶體的起始位址就是4的倍數,這樣cpu訪問一次記憶體就能夠取到資料 跟cpu訪問記憶體的機制有關,加上cache的對映,一般cpu一次訪問64位元組的資料,也有1...

C語言 結構體內存對齊

1 平台原因 不是所有硬體平台都能夠訪問任意位址上的任意資料的,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2 效能原因 主要原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問 而對齊的記憶體訪問僅需要一次訪問...