packed 關鍵字 的作用

2021-08-09 00:13:29 字數 687 閱讀 7113

在移植機智雲的**時,因為結構體裡用了太多的變數,為了節省ram空間 所以加了個__packed關鍵字修飾。

舉個例子:

struct struct_a;

在計算機記憶體中,結構體變數的儲存通常是按字長對齊的,比如8位機裡就按位元組對齊,那麼上述結構體共占用1+4+2+8=15byte。

在16位機裡,變數就按照2位元組對齊,比如a這個成員,雖然是個char型別,位址在0x80000000本身只佔1位元組,但是下乙個成員b卻不能使用0x80000001這個位址,而必須使用0x80000002,這就是按字長對齊。以上結構體占用的空間也就是2+4+2+8=16位元組

同理,在32位機中,如果a在0x80000000的話,b只能放在0x80000004,因為這裡的字長是4個位元組。以上結構體占用空間4+4+4+8=20位元組

也就是說總有一些位元組是浪費掉的,這樣做的目的很簡單,就是因為在大多數計算機體系結構中,對記憶體操作時按整字訪問才能達到最高效率,相當於是以空間換取時間。當然在某些計算機體系結構中,比如arm,是支援非對齊字傳輸的,也就是說變數並不一定要按照字長對齊,儘管這樣可能會降低效率,但換來的是儲存空間上的節約。在mdk中加上__packed關鍵字,可以得到非對齊字的緊湊型結構體,則會強制編譯器將結構體成員按1位元組對齊,則以上結構體占用空間仍為15位元組。

如果編譯器不支援__packed關鍵字,將其定義為空巨集即可  #define  __packed 

關鍵字 volatile關鍵字的作用

1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...

C static關鍵字作用

1.static修飾全域性變數 當同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性,其它的原始檔也能訪問。未加static的全域性變數,在符號表中是global符號,其他目標檔案可見,這樣的符號是要參與符號解析的。加了static之後,是local符號,其他目標檔案不...

C static 關鍵字作用

在全域性變數前加上static關鍵字,全域性變數就定義成了乙個全域性靜態變數。在區域性靜態變數之前加上static,區域性變數就成為乙個區域性靜態變數。在函式返回型別前加static,函式就定義為靜態函式。在類中,靜態成員可以實現多個物件之間的資料共享,並且使用靜態資料成員還不會破壞隱藏的原則,即保...