C++结构体的内存分配细节

在使用C++处理固定长度和结构的数据传输时,直接把接收的数据视为字符数组并按协议约定的数据格式拼接,会涉及大量编程。因此,博主在做项目的时候倾向于在结构体中按协议定义数据类型,然后将接收的数据直接拷贝到结构体的内存中,以实现高效的数据解析。这样既减少了代码量,也提高了处理效率。

在执行这种操作时,需要精确掌握结构体中内存分配的细节。因此博主对其进行了一番研究,总结如下:

  • 空结构体长度为1,验证代码如下:
//创建一个空结构体
struct emptyStruct
{
};
int main()
{
  int emptyStructSize = sizeof(emptyStruct);
  std::cout << "emptyStructSize = " << emptyStructSize << std::endl;
}

输出“emptyStructSize = 1”。
  • 有同一类型数据成员的结构体占用空间为结构体成员占用的空间。验证代码如下:
//创建一个对齐的结构体
struct alignedStruct
{
  char a;//1字节
  char b;//4字节
};
int main()
{
  int alignedStructSize = sizeof(alignedStruct);
  std::cout << "alignedStructSize = " << alignedStructSize << std::endl;
}

输出“alignedStructSize = 2”。

  • 有不同类型数据成员的结构体占用的空间为结构体成员中,占字节最大的数据成员的空间的整数倍。验证代码如下:
//创建一个非对齐的结构体
struct notalignedStruct
{
  char a;//1字节
  int b;//4字节
};
int main()
{
  int notalignedStructSize = sizeof(notalignedStruct);
  std::cout << "notalignedStructSize = " << notalignedStructSize << std::endl;
}

输出“notalignedStructSize = 8”,而结构体中的数据实际上只占了5个字节。原因在于a占用的空间被扩展了,其后面跟着三个没有意义的字节作为填充。由此可以引出一个更加值得注意的点,那就是对于拥有相同对象类型且个数相同的结构体,其长度不一定相同。验证代码如下:

struct Struct1
{
  char a1;//1字节
  char a2;//1字节
  char a3;//1字节
  char a4;//1字节
  int b;//4字节
};
struct Struct2
{
  char a1;//1字节
  char a2;//1字节
  int b;//4字节
  char a3;//1字节
  char a4;//1字节
};
int main()
{
  int Struct1Size = sizeof(Struct1);
  std::cout << "Struct1Size = " << Struct1Size << std::endl;
  int Struct2Size = sizeof(Struct2);
  std::cout << "Struct2Size = " << Struct2Size << std::endl;
}

输出“Struct1Size = 8,Struct2Size = 12”。该结论对于数据传输的意义非常重大,因为在传输中每个数据都是紧挨着的,因此我们在设计结构体的时候不能存在无意义的字节,否则数据会直接对不上。这点需要在制定传输协议的时候就十分注意,否则出了bug非常难以检查。

参考文章

https://blog.csdn.net/weixin_47409662/article/details/128257694

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值