參考文章: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)即可,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/277286.html
標籤:其他
上一篇:并查集
