C++結構體字節對齊示例
示例代碼
#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字節 unsigned int dw; //4字節 int flag; //4字節 }; typedef unsigned char UCHAR; //定義無符號字符變量的別名 typedef unsigned int UINT; //定義無符號整型變量的別名 const int PREAMBLE_LENGTH = 7; //定義整型常量,前導碼占7個字節 const int START_LENGTH = 1; //幀前定界符占1個字節 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; //幀前定界符,標明下一個字節為目的MAC字段 UCHAR dest_add[DESADD_LENGTH]; //指明幀的目的地址 UCHAR source_add[SOURCEADD_LENGTH]; //指明幀的源地址 UCHAR type[TYPE_LENGTH]; //幀中數據的協議類型 vector <UCHAR> data; //vector <UCHAR>占16字節 定義數據的容器存儲數據字段 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個結構體,1個類,類的本質也是結構體。因為運行環境是32位,所以在用sizeof計算結構體或者類的大小時,可能會出現字節對齊的現象,就是sizeof的結果是4的整數倍,從下圖中可以看到struct1結構體變量沒有發生字節對齊,而str1結構體變量和fram1類對象的統計大小時,均發生瞭字節對齊現象(str1結構體變量定義瞭9個字節,對齊到12字節,而MyFrame類原本占42字節,對齊到44字節)
不想讓結構體自動對齊怎麼辦
在頭文件當中添加#pragma pack(1)即可
#include <iostream> //輸入輸出流 using namespace std; #include <vector> //容器 #pragma pack(1) #按1個字節對齊,這樣相當於就沒有內存對齊
添加之後結果
這樣就不會自動字節對齊瞭
以上就是C++結構體字節對齊示例的詳細內容,更多關於C++結構體字節對齊的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- C++如何計算結構體與對象的大小
- 關於C++中由於字節對齊引起內存問題定位分析
- C++中獲取字符串長度的函數sizeof()、strlen()、length()、size()詳解和區別(推薦)
- 聊聊c++數組名稱和sizeof的問題
- 結構體對齊的規則詳解及C++代碼驗證