參考文章:https://fanxinglanyu.blog.csdn.net/article/details/106616772
1 起因
在通信協議中使用定義通信幀結構體變量時,因為結構體中包含多個變量,各自所占的字節數也不同,編譯器會默認用對應最大字節數來編譯各個變量。
這樣會帶來兩個問題:
1)內存資源的浪費;
2)在通訊幀解析函數中,用sizeof函數來計算結構體所占字節數,不是實際的字節長度。
2 說明
使用#pragma pack(n)設定變量以n字節對齊時,存在兩種形式:
1)n大於該變量所占字節數,偏移量使用默認的對齊方式;
2)n小於該變量所占字節數,偏移量為n的倍數。
3 demo
1 #pragma pack (n)
2 //等價於上面的 3 //#pragma pack(push,n) 4 //作用:指定按n字節對齊
5 struct A{ 6 char b; //1 byte 7 int a; //4 bytes 8 short c; //2 bytes 9 }; 10 //#pragma pack(pop) 11 //等價於下面 12 //作用:取消指定對齊,恢復缺省對齊
13 #pragma pack()
如果上面的是按1個字節對齊,那么sizeof(struct A)的值為7;
如果是編譯器默認的方式,sizeof(struct A)的值為12。
注意:
1)#pragma pack(n)一定要與#pragma pack()配合使用;
2)一般令n=1,即#pragma pack(1)即可。