C++結(jié)構(gòu)體字節(jié)對齊示例
示例代碼
#include <iostream> //輸入輸出流 using namespace std; #include <vector> //容器 struct MyStruct { unsigned char start1; unsigned char start2; unsigned char test1[7]; }; struct header { unsigned char by; //1字節(jié) unsigned int dw; //4字節(jié) int flag; //4字節(jié) }; typedef unsigned char UCHAR; //定義無符號字符變量的別名 typedef unsigned int UINT; //定義無符號整型變量的別名 const int PREAMBLE_LENGTH = 7; //定義整型常量,前導碼占7個字節(jié) const int START_LENGTH = 1; //幀前定界符占1個字節(jié) const int DESADD_LENGTH = 6; //目的地址 const int SOURCEADD_LENGTH = 6; //源地址 const int TYPE_LENGTH = 2; //類型字段 const int FCS_LENGTH = 4; //幀校驗地址 class MyFrame1 { public: UCHAR preamble[PREAMBLE_LENGTH]; //前導碼 UCHAR start; //幀前定界符,標明下一個字節(jié)為目的MAC字段 UCHAR dest_add[DESADD_LENGTH]; //指明幀的目的地址 UCHAR source_add[SOURCEADD_LENGTH]; //指明幀的源地址 UCHAR type[TYPE_LENGTH]; //幀中數(shù)據(jù)的協(xié)議類型 vector <UCHAR> data; //vector <UCHAR>占16字節(jié) 定義數(shù)據(jù)的容器存儲數(shù)據(jù)字段 UCHAR fcs[FCS_LENGTH]; //幀校驗序列 }; int main() { MyStruct struct1; cout << sizeof(struct1)<<endl; header str1; cout << sizeof(str1) << endl; MyFrame1 fram1; cout << sizeof(fram1) << endl; return 0; }
以上代碼我定義了2個結(jié)構(gòu)體,1個類,類的本質(zhì)也是結(jié)構(gòu)體。因為運行環(huán)境是32位,所以在用sizeof計算結(jié)構(gòu)體或者類的大小時,可能會出現(xiàn)字節(jié)對齊的現(xiàn)象,就是sizeof的結(jié)果是4的整數(shù)倍,從下圖中可以看到struct1結(jié)構(gòu)體變量沒有發(fā)生字節(jié)對齊,而str1結(jié)構(gòu)體變量和fram1類對象的統(tǒng)計大小時,均發(fā)生了字節(jié)對齊現(xiàn)象(str1結(jié)構(gòu)體變量定義了9個字節(jié),對齊到12字節(jié),而MyFrame類原本占42字節(jié),對齊到44字節(jié))
不想讓結(jié)構(gòu)體自動對齊怎么辦
在頭文件當中添加#pragma pack(1)即可
#include <iostream> //輸入輸出流 using namespace std; #include <vector> //容器 #pragma pack(1) #按1個字節(jié)對齊,這樣相當于就沒有內(nèi)存對齊
添加之后結(jié)果
這樣就不會自動字節(jié)對齊了
以上就是C++結(jié)構(gòu)體字節(jié)對齊示例的詳細內(nèi)容,更多關(guān)于C++結(jié)構(gòu)體字節(jié)對齊的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章

輸入一個字符串,取出其中的整數(shù)(實現(xiàn)代碼)

異步http listener 完全并發(fā)處理懲罰http懇求的小例子