#pragma pack使用方法


參考文章: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)即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM