易錯 C語言結構體內存對齊問題

2021-08-31 23:44:12 字數 780 閱讀 5126

對於乙個結構體的位元組數大家有沒有遇到什麼疑問呢?

先看乙個結構體:

typedef struct test

test_t;

在32位編譯系統下這乙個結構體的位元組數是多少呢?是1+4+1+2=8位元組嗎?不是的,實際結果為12位元組。為什麼呢?因為編譯器會對不足4位元組的變數空間自動補齊為4個位元組(這就是記憶體對齊),以提高cpu的定址效率(32位cpu以4個位元組步長定址的)。

記憶體對齊是編譯器的「管轄範圍」。編譯器為程式中的每個」資料單元「安排在適當的位置上,以便於能快速的找到每個「資料單元」。對於32bit的cpu,其定址的步長為4個位元組(即unsigned int 位元組長度),這就是常說的「4位元組對齊」。同理,對於64bit的cpu,就有「8位元組對齊」。本文以32位的cpu為例。

請看下面**:

#include

typedef struct test

test_t;

int main(void)

執行結果為:

可見,正好印證了上述的說法,補齊之後結構體成員a1,a2,a3的位址之間正好相差4個位元組,a3與a4之間相差兩個位元組也是因為在其中多留出了1個空白位元組。該程式的執行結果可形象地描述為下圖:

a1只占用乙個位元組,為了記憶體對齊保留了三個空白位元組;a3和a4加起來共3位元組,為了記憶體對齊保留了1個空白位元組。這就是編譯器儲存變數時做的見不得人的」手腳「,以方便其雇主——cpu能更快地找到這些變數。

【每日一句】

考慮一千次,不如去做一次;猶豫一萬次,不如實踐一次。華麗的跌倒,勝過無謂的徘徊,邁出第一步,你就成功了一半。

C語言結構體內存對齊問題

1.64位系統,long double在struct結構體中對齊值是8,int float對齊值是4,char對齊值是1,short對齊值2 sizeof long sizeof double 8 2.32位系統,long在struct結構體中對齊值是4,double在struct結構體中對齊值是4...

C語言結構體內存對齊

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

C語言結構體內存對齊

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