前言 :
在Linux下寫ㄧ個 test.c 的程式並定義ㄧ個 t 的struct裡面各有char,short,long,int四種資料型態, 然後把struct的size print出來 :
然後用 gcc 去 compile 並執行 :
但用sizeof所計算出來的t struct卻是 12! (我使用 32bits) 那麼多出來的 1 個byte 是誰佔去了??
原因說明 :
所以程式下面把這個struct的記憶體位置print出來, 轉成方便了解ㄧ點的圖 :
看到沒 char佔 1 byte沒錯, 但是他與下一個short所離的位址卻是2 byte. 這次把 struct 做些修改變成 :
- typedef struct _test
- {
- char ch0;
- char ch1;
- int in;
- short sh;
- }test;
整個被偷吃了4 byte! gcc到底搞了什麼鬼呢? WiKi是有解答的 : http://en.wikipedia.org/wiki/Data_structure_alignment
看到最後面的Example 就是gcc做了padding 的動作 struct變成了 :
- typedef struct _test
- {
- char ch0;
- char ch1;
- char padding0[2];
- int in;
- short sh;
- char padding1[2];
- }test;
解法說明 :
所以要避免這些 padding 的部份, 一是可以如下自己加入 padding :
- typedef struct _test
- {
- char ch0;
- char ch1;
- short sh;
- int in;
- }test;
就不會有被偷吃的地方了, 但是這樣是最基本的人工硬幹方式自己把padding處理掉.
wiki 會紅不是沒有道理的 後面還有教學, 用 #pragma 來更改packing struct的size成1. 在struct的前後加上 :
- #pragma pack(push) /* push current alignment to stack */
- #pragma pack(1) /* set alignment to 1 byte boundary */
- typedef struct _test
- {
- char ch1;
- char ch2;
- int in;
- }test;
- #pragma pack(pop) /* restore original alignment from stack */
如果有加上 #pragma 結果會是 :
padding的部份就不見了, 記憶體位址也堆疊起來了.
補充說明 :
* [C++ 小學堂] pragma comment 的使用
沒有留言:
張貼留言