Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么结构和联合体之间存在尺寸不匹配?_C++_C_Linux_Gcc - Fatal编程技术网

C++ 为什么结构和联合体之间存在尺寸不匹配?

C++ 为什么结构和联合体之间存在尺寸不匹配?,c++,c,linux,gcc,C++,C,Linux,Gcc,我已经声明了一个将4100字节分配给变量“sample_union”的联合,并作为分配4104字节的结构的一部分进行了相同的联合声明 union test_size_union { struct { uint8_t type; union { uint8_t count; uint8_t list; }; uint16_t rc; uint16_t arr_va

我已经声明了一个将4100字节分配给变量“sample_union”的联合,并作为分配4104字节的结构的一部分进行了相同的联合声明

union test_size_union {
    struct {
        uint8_t type;
        union {
            uint8_t count;
            uint8_t list;
        };
        uint16_t rc;
        uint16_t arr_value[2048];
    };
    uint64_t first_dword;
}__attribute__((packed)) sample_union ;
struct test_size_struct {
    union {
        struct {
            uint8_t type;
            union {
                uint8_t count;
                uint8_t list;
            };
            uint16_t rc;
            uint16_t arr_value[2048];
        };
        uint64_t first_dword;
    };
}__attribute__((packed)) sample_struct;
将上述union放在结构内部将分配4104字节

union test_size_union {
    struct {
        uint8_t type;
        union {
            uint8_t count;
            uint8_t list;
        };
        uint16_t rc;
        uint16_t arr_value[2048];
    };
    uint64_t first_dword;
}__attribute__((packed)) sample_union ;
struct test_size_struct {
    union {
        struct {
            uint8_t type;
            union {
                uint8_t count;
                uint8_t list;
            };
            uint16_t rc;
            uint16_t arr_value[2048];
        };
        uint64_t first_dword;
    };
}__attribute__((packed)) sample_struct;
这不是一个项目要求,但我想知道为什么编译器在这两个声明中的行为不同

gcc版本:(gcc)4.9.2,x86_64


平台:Linux,x86_64

当您将联合体放在结构中时,您没有将联合体标记为已打包。未打包的联合有一点填充(四个字节),因此它的大小是
uint64\u t
大小的倍数

压缩接头没有这种衬垫,所以它更小


作为旁白,联合体内部的匿名结构没有标记为
packed
。在这种情况下,这并不重要,因为所有的东西都是很好地对齐的,但是它是需要注意的。

注意到C++结构不允许匿名结构(GCC确实提供它作为扩展)。所以在大多数机器上占用4096字节。@user50不在注释中发布多行代码;换言之,我的原话是:工会内部的结构没有打包。实际上,打包工会在这种情况下是有意义的。未打包的联合具有一些填充,因此其大小是8的倍数(sizeof(uint64_t))。拥挤的工会没有。