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

 更新时间:2022年06月23日 10:15:39   作者:Bug挖掘机  
这篇文章主要为大家介绍了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++结构体字节对齐的资料请关注脚本之家其它相关文章!

相关文章

  • C/C++ 实现简易HTTP服务器的示例

    C/C++ 实现简易HTTP服务器的示例

    这篇文章主要介绍了C/C++ 实现简易HTTP服务器的示例,帮助大家更好的理解和学习C/C++编程,感兴趣的朋友可以了解下
    2020-10-10
  • C++20中的span容器及用法小结

    C++20中的span容器及用法小结

    std::span 是一个非常实用的工具,可以方便地对数据进行访问和处理,同时也可以提高代码的可读性、可维护性和安全性,这篇文章主要介绍了C++20中的span容器,需要的朋友可以参考下
    2023-03-03
  • C语言如何实现顺序表(数据结构)

    C语言如何实现顺序表(数据结构)

    这篇文章主要介绍了C语言如何实现顺序表(数据结构)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言实现大数据文件的内存映射机制

    C语言实现大数据文件的内存映射机制

    这篇文章主要介绍了C语言实现大数据文件的内存映射机制的相关资料,需要的朋友可以参考下
    2017-01-01
  • C++求1到n中1出现的次数以及数的二进制表示中1的个数

    C++求1到n中1出现的次数以及数的二进制表示中1的个数

    这篇文章主要介绍了C++求1到n中1出现的次数以及数的二进制表示中1的个数,两道基础的算法题目,文中也给出了解题思路,需要的朋友可以参考下
    2016-02-02
  • C++中的String的常用函数用法

    C++中的String的常用函数用法

    这篇文章主要介绍了C语言中String的常用函数用法,对学习String的小伙伴有一定的参考价值,感兴趣的小伙伴可以借鉴一下
    2023-03-03
  • Qt中树形控件Tree Widget的使用方法汇总

    Qt中树形控件Tree Widget的使用方法汇总

    最近小编在研究Tree Widget树形控件的相关知识,这种控件其实有时还是很有用处的,我主要利用的是带有复选框的树形控件,下面通过实例代码给大家介绍下Qt中树形控件Tree Widget的一些使用方法,感兴趣的朋友一起学习吧
    2021-11-11
  • C#委托所蕴含的函数指针概念详细解析

    C#委托所蕴含的函数指针概念详细解析

    C#中用委托这种概念实现了函数指针技术而已,另外.ent提供额外的安全性,当然也损失了灵活性
    2013-09-09
  • 深入理解Java事务的原理与应用

    深入理解Java事务的原理与应用

    下面小编就为大家带来一篇深入理解Java事务的原理与应用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • C语言基于EasyX库实现有图形界面钟表

    C语言基于EasyX库实现有图形界面钟表

    这篇文章主要介绍了C语言基于EasyX库实现有图形界面钟表,直线转动端点计算,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论