0

所以我有一个结构,我通常只执行 sizeof(mystruct) 并且在为 x86 编译时它会返回 0x2C,但是一旦我将编译器切换到 JUST x86_64,它就会告诉我大小为 0x30,这对我来说毫无意义。

这是结构:

typedef struct Struct
{
    int32_t unk1;       // 0x0
    int32_t unk2;       // 0x4
    int32_t unk3;       // 0x8
    int32_t unk4;       // 0xC

    int64_t    guid;       // 0x10
    int32_t  entryID;   // 0x18
    int32_t  bytes;     // 0x1C
    int32_t  duration;  // 0x20
    int32_t  expiration;   // 0x24

    int32_t  unk5;      // 0x28
} Struct;

然后我做:

Struct mystruct;
NSLog(@"0x%X", sizeof(mystruct));

它打印出 0x30,但不应该是 0x2C 吗?我看不出我的问题出在哪里

谢谢!

4

1 回答 1

7

它是结构填充,以确保您的类型的数组与您的架构正确对齐。如果你有一个数组:

Struct myarray[2];

然后每个元素在 x86 上需要 4 字节对齐,但在 x86-64 上需要 8 字节对齐。为了保证这一点,总结构大小必须是 8 字节的倍数,因此编译器在末尾添加了额外的填充。

于 2013-03-19T18:13:56.260 回答