結構體內存對齊

2021-08-25 02:36:48 字數 1069 閱讀 4789

記憶體對齊

記憶體對齊」應該是編譯器的「管轄範圍」。編譯器為程式中的每個「資料單元」安排在適當的位置上,但是c語言的乙個特點就是太靈活,太強大,它允許你干預「記憶體對齊」。

為什麼存在記憶體對齊?

1.平台原因(移植原因)

不是所有的硬體平台任意位址上的任意資料的,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。

2.效能原因:

資料結構(尤其是棧)應該盡可能的在自然邊界上對齊,原因在於為了訪問未對齊的記憶體處理器需要做兩次記憶體訪問,而對齊的記憶體訪問僅需要一次訪問。

本質:結構體內存是拿空間換取時間的做法。

結構體內存對齊規則:1.第乙個成員在與結構體變數偏移量為0的位址處。

2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。

對齊數 = 編譯器預設的乙個對齊數與該成員大小的較小值。

vs中預設的值為8;linux中的預設值為4

3.結構體總大小為最大對齊數(每個成員變數除了第乙個成員都有乙個對齊數)的整數倍。

4.如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

注:既要滿足對齊,又要節省空間可以讓占用空間小的成員盡量集中在一起。

例:

struct a

;struct b

;

sizeof(a) = 24;

這個比較好理解,int為4,double為8,float為4,總長為8的倍數,補齊,所以整個a為24。

sizeof(b) = 48;

這個和a不同的就是在b中有a的結構體,所以最大對齊數也要看a的最大對齊數。

常見型別的對齊模數:

結構體內存對齊

結構體內存對齊 一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這...

結構體內存對齊

一 什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的...

結構體內存對齊

對齊規則 每個特定平台上的編譯器都有自己的預設 對齊係數 也叫對齊模數 程式設計師可以通過預編譯命令 pragma pack n n 1,2,4,8,16來改變這一係數,其中的n就是你要指定的 對齊係數 規則 1 資料成員對齊規則 結構 struct 的資料成員,第乙個資料成員放在offset為0的...