《C語言筆記 結構體內存對齊》

2022-05-23 15:18:10 字數 1773 閱讀 5544

1,現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問都可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問。

2,所以這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。記憶體對齊又分為自然對齊和規則對齊

3,對於記憶體對齊問題,主要存在於struct和union等復合結構在記憶體中的分布情況,許多實際的計算機系統對基本型別資料在記憶體中存放的位置有限制,它們要求這些資料的首位址的值是某個數m(通常是4或8);

4,對於記憶體對齊,主要是為了提高程式的效能,資料結構,特別是棧,應盡可能在自然邊界上對齊,經過對齊後,cpu的記憶體訪問速度大大提公升。

1,指的是將對應變數型別存入對應位址值的記憶體空間,即資料要根據其資料型別存放到以其資料型別為倍數的位址處。例如char型別佔1個位元組空間,1的倍數是所有數,因此可以放置在任何允許位址處,而int型別佔4個位元組空間,以4為倍數的位址就有0,4,8等。編譯器會優先按照自然對齊進行資料位址分配。

1,以結構體為例就是在自然對齊後,編譯器將對自然對齊產生的空隙記憶體填充無效資料,且填充後結構體占記憶體空間為結構體內佔記憶體空間最大的資料型別成員變數的整數倍。

1,系統的位數指定的位元組對齊長度決定著資料實際所占用的記憶體空間大小。

2,系統的位數決定的是基本資料型別的所佔記憶體空間。     

資料型別

16位系統

32位系統

64位系統

char

1位元組1位元組

1位元組char*

2位元組4位元組

8位元組short int

2位元組2位元組

2位元組int

2位元組4位元組

4位元組unsigned int

2位元組4位元組

4位元組float

4位元組4位元組

4位元組double

8位元組8位元組

8位元組long

4位元組4位元組

8位元組long long

8位元組8位元組

8位元組unsigned long

4位元組4位元組

8位元組3,位元組對齊長度決定著資料按規則排布時填充的位元組個數。

1,對齊位元組#pragam pack (n)中指定的數 n這個資料結構中最大的資料成員的位元組大小較小的那個數決定。

2,填充後的資料結構的總的所佔記憶體空間 為 第1條中的對齊位元組數的整數倍

3,資料結構中陣列成員的對齊的長度是按照陣列元素型別的長度來比對的。

4,指定對齊長度長於struct中的型別長度最長的值時,指定的這個對齊長度等於無用。

#include#pragma pack(8)typedef 

struct

mystruct7s7;

typedef

struct

mystruct9s9;

typedef

struct

mystruct10s10;

intmain()

#pragma pack()

C語言結構體內存對齊

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

C語言結構體內存對齊

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

C語言 結構體內存對齊

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