小编use*_*r50的帖子

为什么结构和工会之间存在尺寸不匹配?

我已经声明了一个联合将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 ;
Run Code Online (Sandbox Code Playgroud)

将上述联合置于结构内部分配4104个字节.

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;
Run Code Online (Sandbox Code Playgroud)

嗯,这不是项目要求,但我想知道为什么编译器对这两个声明的行为不同.

gcc版本:(GCC)4.9.2,x86_64

平台:Linux,x86_64

c c++ linux gcc

10
推荐指数
1
解决办法
283
查看次数

64位机器上的结构填充

struct A
{
    uint32_t var1;
    uint32_t var2;
    uint32_t var3;
    uint32_t var4;
    uint32_t var5;
};
Run Code Online (Sandbox Code Playgroud)

在上面的结构中,编译器不会填充并分配20个字节.

现在我们有另一个结构,它包含一个8字节变量而不是两个4字节.在这种情况下,编译器填充并为此结构分配24个字节.

struct B
{
    uint32_t var1;
    uint32_t var2;
    uint32_t var3;
    uint64_t var5;
};
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种行为?如果编译器将数据对齐到8字节边界,那么在第一个结构中应该有4个字节的填充,并且在这种情况下不应该填充第二个结构.如果编译器将数据对齐到4字节边界,那么为什么在第二个结构中有4个字节的填充?

编译器:GCC平台:64位linux,x86_64

c c++ structure padding

8
推荐指数
1
解决办法
5691
查看次数

标签 统计

c ×2

c++ ×2

gcc ×1

linux ×1

padding ×1

structure ×1