sizeof struct with pack(push,1)

时间:2017-12-19 09:04:11

标签: c++ sizeof

我在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;
    }
}

为什么?

2 个答案:

答案 0 :(得分:1)

位域是特定于实现的。

似乎msvc使用

struct test1{
    uint8_t  // a1, a2, a3, a4
    uint8_t  // a5, a6
    uint16_t // a7
};

可能是因为a6使用uint8_ta7使用uint16_t

gcc似乎将a5a6打包到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)