以前沒太總結,今天看飛卡的書偶然看到的乙個關於嵌入式c結構體的知識,趕緊來記錄下,方便以後忘記了再次查閱。
1、自然對齊
兩個原則:對了,忘了解釋這個偏移量的概念了。變數的存放位址相對於結構起始位址的偏移量。1、各個型別偏移量必須是自身所佔位元組數的整數倍。
(譬如,int佔4位元組,它的偏移量也必須是4的倍數)
2、總的大小必須為該結構體中最大記憶體的整數倍,不夠需要補充。
單獨談及概念的話,也許比較難受,那麼直接上**吧。
#include
#include
struct mystruct
mystruct;
int main()
答案: 8+1+3+4= 16這麼加,什麼意思呢?
莫急,且聽我細細道來。我不是前面說了兩條金科玉律了嘛?比照著來。
第一條,每個型別的偏移量是自身所佔位元組的整數倍。第乙個型別是double,偏移量是0,自身所佔位元組8。符合條件。那麼此時對應的結果為:8+1+3+4 = 16然後就是char,自身所佔位元組1,偏移量8。符合條件。
接著int,自身所佔位元組4,偏移量為9的話,不符合4的倍數這個條件。
應空出3個位元組,讓偏移量為12,此時滿足4的倍數。
對了,還要驗證一下是否符合第二條,滿足最終答案是最大位元組數的整數倍。故答案就是16咯。
那麼接下來再看乙個:
#include
#include
struct mystruct
mystruct;
int main()
char和double換了一下位置呢,
答案:1+7+8+4+4 = 24emmm,,, 也許參照前面的你算出的答案可能是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劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各個硬體平...