C++結(jié)構(gòu)體字節(jié)對(duì)齊示例
示例代碼
#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; //定義無符號(hào)字符變量的別名
typedef unsigned int UINT; //定義無符號(hào)整型變量的別名
const int PREAMBLE_LENGTH = 7; //定義整型常量,前導(dǎo)碼占7個(gè)字節(jié)
const int START_LENGTH = 1; //幀前定界符占1個(gè)字節(jié)
const int DESADD_LENGTH = 6; //目的地址
const int SOURCEADD_LENGTH = 6; //源地址
const int TYPE_LENGTH = 2; //類型字段
const int FCS_LENGTH = 4; //幀校驗(yàn)地址
class MyFrame1
{
public:
UCHAR preamble[PREAMBLE_LENGTH]; //前導(dǎo)碼
UCHAR start; //幀前定界符,標(biāo)明下一個(gè)字節(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ù)的容器存儲(chǔ)數(shù)據(jù)字段
UCHAR fcs[FCS_LENGTH]; //幀校驗(yàn)序列
};
int main()
{
MyStruct struct1;
cout << sizeof(struct1)<<endl;
header str1;
cout << sizeof(str1) << endl;
MyFrame1 fram1;
cout << sizeof(fram1) << endl;
return 0;
}以上代碼我定義了2個(gè)結(jié)構(gòu)體,1個(gè)類,類的本質(zhì)也是結(jié)構(gòu)體。因?yàn)檫\(yùn)行環(huán)境是32位,所以在用sizeof計(jì)算結(jié)構(gòu)體或者類的大小時(shí),可能會(huì)出現(xiàn)字節(jié)對(duì)齊的現(xiàn)象,就是sizeof的結(jié)果是4的整數(shù)倍,從下圖中可以看到struct1結(jié)構(gòu)體變量沒有發(fā)生字節(jié)對(duì)齊,而str1結(jié)構(gòu)體變量和fram1類對(duì)象的統(tǒng)計(jì)大小時(shí),均發(fā)生了字節(jié)對(duì)齊現(xiàn)象(str1結(jié)構(gòu)體變量定義了9個(gè)字節(jié),對(duì)齊到12字節(jié),而MyFrame類原本占42字節(jié),對(duì)齊到44字節(jié))

不想讓結(jié)構(gòu)體自動(dòng)對(duì)齊怎么辦
在頭文件當(dāng)中添加#pragma pack(1)即可
#include <iostream> //輸入輸出流 using namespace std; #include <vector> //容器 #pragma pack(1) #按1個(gè)字節(jié)對(duì)齊,這樣相當(dāng)于就沒有內(nèi)存對(duì)齊
添加之后結(jié)果

這樣就不會(huì)自動(dòng)字節(jié)對(duì)齊了
以上就是C++結(jié)構(gòu)體字節(jié)對(duì)齊示例的詳細(xì)內(nèi)容,更多關(guān)于C++結(jié)構(gòu)體字節(jié)對(duì)齊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c++詳細(xì)講解構(gòu)造函數(shù)的拷貝流程
拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它在創(chuàng)建對(duì)象時(shí),是使用同一類中之前創(chuàng)建的對(duì)象來初始化新創(chuàng)建的對(duì)象??截悩?gòu)造函數(shù)通常用于:通過使用另一個(gè)同類型的對(duì)象來初始化新創(chuàng)建的對(duì)象。?復(fù)制對(duì)象把它作為參數(shù)傳遞給函數(shù)。復(fù)制對(duì)象,并從函數(shù)返回這個(gè)對(duì)象2022-05-05
strcat函數(shù)實(shí)現(xiàn)簡(jiǎn)單示例
這篇文章主要介紹了strcat函數(shù)實(shí)現(xiàn)簡(jiǎn)單示例,需要的朋友可以參考下2014-03-03
輸入一個(gè)字符串,取出其中的整數(shù)(實(shí)現(xiàn)代碼)
win32 api實(shí)現(xiàn)簡(jiǎn)單的消息窗口示例
C++發(fā)送HTTP請(qǐng)求的實(shí)現(xiàn)代碼
異步http listener 完全并發(fā)處理懲罰http懇求的小例子
php5系列的apache遠(yuǎn)程執(zhí)行漏洞攻擊腳本

