C語言中關於結構體的記憶體對齊

2021-08-14 22:42:35 字數 1594 閱讀 3225

以前沒太總結,今天看飛卡的書偶然看到的乙個關於嵌入式c結構體的知識,趕緊來記錄下,方便以後忘記了再次查閱。

1、自然對齊

兩個原則:

1、各個型別偏移量必須是自身所佔位元組數的整數倍。

(譬如,int佔4位元組,它的偏移量也必須是4的倍數)

2、總的大小必須為該結構體中最大記憶體的整數倍,不夠需要補充。

對了,忘了解釋這個偏移量的概念了。變數的存放位址相對於結構起始位址的偏移量。

單獨談及概念的話,也許比較難受,那麼直接上**吧。

#include 

#include

struct mystruct

mystruct;

int main()

答案: 8+1+3+4= 16

這麼加,什麼意思呢?

莫急,且聽我細細道來。

我不是前面說了兩條金科玉律了嘛?比照著來。

第一條,每個型別的偏移量是自身所佔位元組的整數倍。第乙個型別是double,偏移量是0,自身所佔位元組8。符合條件。

然後就是char,自身所佔位元組1,偏移量8。符合條件。

接著int,自身所佔位元組4,偏移量為9的話,不符合4的倍數這個條件。

應空出3個位元組,讓偏移量為12,此時滿足4的倍數。

那麼此時對應的結果為:8+1+3+4 = 16

對了,還要驗證一下是否符合第二條,滿足最終答案是最大位元組數的整數倍。故答案就是16咯。

那麼接下來再看乙個:

#include 

#include

struct mystruct

mystruct;

int main()

char和double換了一下位置呢,

答案:1+7+8+4+4 = 24

emmm,,, 也許參照前面的你算出的答案可能是20,為啥還要+4啊,別忘了第二條玉律,必須是8的倍數,只能加4。

2、自定義對齊

使用#pragma pack(n),也是兩條規矩:

自身所佔位元組小於n,按照預設的對齊方式

自身索贊位元組大於n,那麼偏移量必須是n的整數倍。

還不清楚?沒關係,看**!

#include 

#include

#pragma pack(push)

#pragma pack(4)

struct mystruct

mystruct;

#pragma pack(pop)

int main()

猜,答案會是多少?

答案: 1+3+8+4 = 16

和剛才的24有區別吧,,

學會了吧,,哈哈哈。。。

關於C語言中結構體 聯合的記憶體對齊

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

關於C語言中的結構體對齊

關於c語言中的結構體對齊 1 什麼是位元組對齊 乙個變數占用 n 個位元組,則該變數的起始位址必須能夠被 n 整除,即 存放起始位址 n 0,對於結構體而言,這個 n 取其成員種的資料型別佔空間的值最大的那個。2 為什麼要位元組對齊 記憶體空間是按照位元組來劃分的,從理論上說對記憶體空間的訪問可以從...

c語言中結構體對齊詳解

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