服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++结构体字节对齐示例

C++结构体字节对齐示例

2023-02-08 14:51Bug挖掘机 C/C++

这篇文章主要为大家介绍了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字节)

C++结构体字节对齐示例

 

不想让结构体自动对齐怎么办

在头文件当中添加#pragma pack(1)即可

#include <iostream>    //输入输出流
using namespace std;
#include <vector>      //容器
#pragma pack(1)         #按1个字节对齐,这样相当于就没有内存对齐

添加之后结果

C++结构体字节对齐示例

这样就不会自动字节对齐了

以上就是C++结构体字节对齐示例的详细内容,更多关于C++结构体字节对齐的资料请关注服务器之家其它相关文章!

原文链接:https://blog.51cto.com/u_15694353/5410631

延伸 · 阅读

精彩推荐