星期三, 7月 09, 2014

The Lost Art of C Structure Packing

找 C/C++ padding 資料時找到的文章:The Lost Art of C Structure Packing

講解 C/C++ struct padding 講的很仔細。C/C++ 編譯器會為了記憶體對齊而把變數放到偶數位址上,放到偶數位址上的好處是存取快速,而且編譯出來的指令也較少。但像 char 型態的變數佔用的空間不一定會是偶數,所以為了對齊而空出來的空間就是所謂的 padding。例如:
裏面的 pad 就是浪費掉的空間。

除了 padding 還有提到 pack,我以前對 pack 也不太了解。看完這篇才知道 pack 的意思,pack 就是告訴編譯器說,不要把變數對齊到偶數的位址上,當然,這樣做之後,編譯器就不會作 padding,但代價就是效能。在 gcc 裡,用 #pragma pack 就可以。

最後作者的建議就是:
  1. 除非你知道自己在做什麼,否則沒必要使用 pack。
  2. 安排 struct 成員時,先放指標類成員,再依照型態所佔用的空間大小來依序擺放,這樣可以避免不必要的 padding。

沒有留言: