引言
在進行網絡傳輸的時候,常常會定義協議的書庫類型,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]
};