引言
在进行网络传输的时候,常常会定义协议的书库类型,json,还是结构体。
下面就说说其中要注意的事项
结构体的长度
如何获取结构体的长度
struct MyStruct
{
int a;
int b;
int c;
};
MyStruct m;
int len = sizeof(m);
std::cout << len << std::endl;
// 输出 是 12 ,(每个int的长度是4)
类的长度
MyClass::MyClass()
{
}
MyClass m;
int len = sizeof(m);
std::cout << len << std::endl;
// 输出 是 1 ,(空类的长度是1)
std::string
std::string str="123456789";
int len = sizeof(str);
std::cout << len << std::endl;
// 输出是 28
在使用VS2015的32位debug构建中,sizeof(std::string)返回28;在64位debug构建中,得到40;在32位release构建中,得到24,在64位release构建中,得到32。
这是因为std::string的内部表示随不同的构建选项而变化:例如,调试构建通常包含额外的机制以帮助发现bug,这会增加表示的大小;此外,在64位构建中,指针更大,所以大小相对32位构建的要大点。
std::string str="123456789";
std::cout << str.length() << std::endl;
// 输出是 9
输出是 字符串的长度
注意
struct MyStruct
{
int a;
int b;
int c;
std::string str;
};
按照上面的方式定义结构体,在网络传输中,由于str长度的不确定,在解析的时候,会出现问题。
所以要使用定常的数据类型比如
struct MyStruct
{
int a;
int b;
int c;
char[256]
};