在使用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