比如:
typedef__packedstructread_command
read_command;
與typedefstructread_command
read_command;
的區別是什麼啊?
回答:沒有__packed的會出現字對齊等也就是,char型的有可能是占用4個位元組的長度的記憶體空間有__packed的就不會,就肯定是1個位元組的記憶體空間,是gcc編譯器的關鍵字。(不止vc下面32位的系統裡面的記憶體資料的訪問是32位的,處理的時候都是4個位元組為單位,通常也就是int的長度。如果不定義壓縮方式,也就是編譯選項沒有諸如#pragma pack(1)之類的,那麼系統會進行4位元組對齊)
注意:_packed只是某種編譯器的格式壓縮,有的是pack呢,對不同的cpu壓縮的對齊方式也不一樣,在使用了該關鍵以後在進行操作時需要格外小心。
宣告結構型別時,可以包含乙個保留字packed,用於實現壓縮資料儲存。
當乙個記錄型別在 狀態下宣告或者宣告中包括了保留字 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];
其中問題的關鍵就在於正點原子自定義的mymalloc函式沒有實現4位元組對齊。
位元組順序 位元組對齊
一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...
位元組順序 位元組對齊
一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...
位元組對齊 8位元組對齊
參考博文 參考1 參考2 參考3 在記憶體管理中經常使用位元組對齊來管理分配的記憶體。1 原理 2 演算法 2.1unsigned intcalc align unsigned int n,unsigned align 2.2 更好的演算法 unsigned intcalc align unsign...