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; //定義無(wú)符號(hào)字符變量的別名
typedef unsigned int UINT; //定義無(wú)符號(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/C++ 實(shí)現(xiàn)簡(jiǎn)易HTTP服務(wù)器的示例
這篇文章主要介紹了C/C++ 實(shí)現(xiàn)簡(jiǎn)易HTTP服務(wù)器的示例,幫助大家更好的理解和學(xué)習(xí)C/C++編程,感興趣的朋友可以了解下2020-10-10
C語(yǔ)言如何實(shí)現(xiàn)順序表(數(shù)據(jù)結(jié)構(gòu))
這篇文章主要介紹了C語(yǔ)言如何實(shí)現(xiàn)順序表(數(shù)據(jù)結(jié)構(gòu))問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
C語(yǔ)言實(shí)現(xiàn)大數(shù)據(jù)文件的內(nèi)存映射機(jī)制
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)大數(shù)據(jù)文件的內(nèi)存映射機(jī)制的相關(guān)資料,需要的朋友可以參考下2017-01-01
C++求1到n中1出現(xiàn)的次數(shù)以及數(shù)的二進(jìn)制表示中1的個(gè)數(shù)
這篇文章主要介紹了C++求1到n中1出現(xiàn)的次數(shù)以及數(shù)的二進(jìn)制表示中1的個(gè)數(shù),兩道基礎(chǔ)的算法題目,文中也給出了解題思路,需要的朋友可以參考下2016-02-02
C#委托所蘊(yùn)含的函數(shù)指針概念詳細(xì)解析
C#中用委托這種概念實(shí)現(xiàn)了函數(shù)指針技術(shù)而已,另外.ent提供額外的安全性,當(dāng)然也損失了靈活性2013-09-09
C語(yǔ)言基于EasyX庫(kù)實(shí)現(xiàn)有圖形界面鐘表
這篇文章主要介紹了C語(yǔ)言基于EasyX庫(kù)實(shí)現(xiàn)有圖形界面鐘表,直線轉(zhuǎn)動(dòng)端點(diǎn)計(jì)算,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

