我在qt项目中有结构:
qDebug() << "sizeof(Mi28NE::test1)" << sizeof(Mi28NE::test1);
检查尺寸。
>> sizeof(Mi28NE::test1) 3
MinGW编译器中的结果:
>> sizeof(Mi28NE::test1) 4
MSVC编译器中的结果:
public class DataService
{
private static string _requestUri = "https://requesturi.com/";
public static async Task<LocalizationData> GetLocalization(string code)
{
string queryString = _requestUri + "get_localization.php" + "?code=" + code;
HttpClient client = new HttpClient();
var response = await client.GetAsync(queryString);
dynamic data = null;
if (response != null)
{
string json = response.Content.ReadAsStringAsync().Result;
data = JsonConvert.DeserializeObject(json);
if (data["status"] == "success")
{
List<string> aliases = new List<string>();
List<string> translations = new List<string>();
foreach (var localization in data["localizations"])
{
aliases.Add((string)localization["alias"]);
translations.Add((string)localization["translation"]);
}
LocalizationData localizationData = new LocalizationData(code, aliases.ToArray(), translations.ToArray());
return localizationData;
}
else
{
return null;
}
}
return null;
}
}
为什么?
答案 0 :(得分:1)
位域是特定于实现的。
似乎msvc使用
struct test1{
uint8_t // a1, a2, a3, a4
uint8_t // a5, a6
uint16_t // a7
};
可能是因为a6
使用uint8_t
而a7
使用uint16_t
。
gcc似乎将a5
和a6
打包到uint16_t
使用的a7
。
您可能会得到更多类似的结果:
#pragma pack(push,1)
struct test1{
uint8_t a1 : 3;
uint8_t a2 : 1;
uint8_t a3 : 3;
uint8_t a4 : 1;
uint16_t a5 : 3;
uint16_t a6 : 1;
uint16_t a7 : 12;
};
#pragma pack(pop)
答案 1 :(得分:-2)
此结构的sizeof返回真实答案:
#pragma pack(push,1)
struct test1{
uint8_t a1 : 3;
uint8_t a2 : 1;
uint8_t a3 : 3;
uint8_t a4 : 1;
uint16_t a5 : 3;
uint16_t a6 : 1;
uint16_t a7 : 12;
};
#pragma pack(pop)