好比:html
typedef __
packed
struct READ_Command
{
u_char code;
u_int addr;
u_char len;
} READ_Command;
與
typedef
struct READ_Command
{
u_char code;
u_int addr;
u_char len;
} READ_Command;
的區別是什麼啊?
回答:沒有__
packed的會出現字對齊等也就是,char型的有多是佔用4個字節的長度的內存空間有__
packed 的就不會,就確定是1個字節的內存空間,是gcc編譯器的關鍵字。(不止vc下面32位的系統裏面的內存數據的存取是32位的,處理的時候都是4個字節爲單位,一般也就是int的長度。若是不定義壓縮方式,也就是編譯選項沒有諸如#pragma pack(1)之類的,那麼系統會進行4字節對齊)
注意:_
packed只是某種編譯器的格式壓縮,有的是pack呢,對不一樣的CPU壓縮的對齊方式也不同,在使用了該關鍵之後在進行操做時須要格外當心。
聲明結構類型時,能夠包含一個保留字packed,用於實現壓縮數據存儲。
當一個記錄類型在 {$A-} 狀態下聲明或者聲明中包括了保留字 packed 時,記錄中的字段不被調整,而替換爲賦予連續的偏移量。這樣一個壓縮記錄的總尺寸就是全部字段的尺寸的和。由於數據調整尺寸可能改變(如不一樣版本的編譯器對同一種數據類型的調整值可能不一樣),因此當想要把記錄寫入磁盤時或者在內存中傳遞到另外一模塊而該模塊由不一樣版本的編譯器編譯時,最好仍是壓縮全部的記錄。(
delphi
borland 中也有該關鍵字)
3.在 Cotex-M3 programming manual 中有提到對齊問題
1.一般編譯器在生成代碼的時候都會進行結構體填充,保證(結構體內部成員)最高性能的對齊方式。
2.編譯器自動分配出來結構體的內存(好比定義爲全局變量或局部變量)確定是對齊的。
3.查閱幫助文檔的malloc部分,mdk的標準malloc申請的內存區時8字節對齊的。
4.若自定義的malloc函數自己沒有對分配的內存實現4字節或以上的對齊操做,分配出來的不對齊的內存,編譯器是不知道的,因此極可能會產生問題。
此時最好的解決方式在內存池數組前添加__align(4)關鍵字,只需保證自定義malloc分配出來的首地址是4字節對齊。
好比:__align(4) u8 mem1base[MEM1_MAX_SIZE];
相關更多stm32字節對齊問題的討論,請參考正點原子相關帖子http://www.openedv.com/thread-7415-1-1.html。
其中問題的關鍵就在於正點原子自定義的mymalloc函數沒有實現4字節對齊。