typedef __packed struct

        之前一直很少用結構體,但最近隨着變量的直線上升,不得不採用結構體。對於struct,理解並不是很深入,最近一段時間的應用,發現struct的強大。作爲一種數據集合,struct常用在數據結構中。而struct的字節對齊方式對於嵌入式底層的程序員來講是必須掌握的。

        現代計算機中內存空間都是按照byte劃分的,從理論上講似乎對任何類型的變量的訪問可以從任何地址開始,但實際情況是在訪問特定類型變量的時候經常在特定的內存地址訪問,這就需要各種類型數據按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。

        對齊的作用和原因:各個硬件平臺對存儲空間的處理上有很大的不同。一些平臺對某些特定類型的數據只能從某些特定地址開始存取。比如有些架構的CPU在訪問 一個沒有進行對齊的變量的時候會發生錯誤,那麼在這種架構下編程必須保證字節對齊.其他平臺可能沒有這種情況,但是最常見的是如果不按照適合其平臺要求對 數據存放進行對齊,會在存取效率上帶來損失。比如有些平臺每次讀都是從偶地址開始,如果一個int型(假設爲32位系統)如果存放在偶地址開始的地方,那麼一個讀週期就可以讀出這32bit,而如果存放在奇地址開始的地方,就需要2個讀週期,並對兩次讀出的結果的高低字節進行拼湊才能得到該32bit數 據。顯然在讀取效率上下降很多。
         typedef __packed struct字節對齊

   __packed關鍵字的意思是在structunion結構中不添加填充字節,如:

 typedef struct S{

        charc;

        doubled;

        chare;

   };

此處假設char佔用1個字節,double佔用8個。則在c後面會有7個字節的填充字節,在e後面也一樣。結構體共佔用24個字節。

如果定義:

typedef _Packedstruct{

charc;

double d;

chare;

}

Packed_S;

則該結構體將只佔用10個字節。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章