结构太大了

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (11)

我正在制作一个关于我的世界的ripoff,我正在使用一个结构来存储项目,而这只是:

typedef struct Item {
    union {
        struct {
            int V:4;
            int Q:6;
            int ID;
        } BItem;
        struct {
            union {
                struct {
                    int V:4;
                    int Q:6;
                    int ID;
                } BItem;
                struct {
                    int *Ench;
                    double Durability;
                    char *Name;
                    int ID;
                } TItem;
            } Item[4][8];
            enum {
                ICBItem,
                ICTItem
            } Type;
        } CItem;
        struct {
            int *Ench;
            double Durability;
            char *Name;
            int ID;
        } TItem;
    } ItemUnion;
    enum {
        BItem,
        CTtem,
        TItem
    } Type;
    void *UseHandler;
} Item;

我在这上面使用sizeof,我得到1024字节。这不应该占用这么多的记忆。谁能解释一下?我发现这非常令人沮丧,我希望将它作为数字存储到文件中,使用memcpy以某种方式将结构转换为int,但是对于大型结构,NO intager是足够大的。

提问于
用户回答回答于

这个

            } Item[4][8];

是尺寸的32倍

            struct {
                int *Ench;
                double Durability;
                char *Name;
                int ID;

使用8字节的int指针和8字节的双精度以及8字节的char指针和4字节的int以及一些未知的填充以使对齐正确,这可能是32字节。所以4 x 8 x 32是1024字节。

试试这段代码:

int main()
{
    Item x;
    printf("%zu\n", sizeof x);
    printf("%zu\n", sizeof x.ItemUnion.CItem);
    printf("%zu\n", sizeof x.ItemUnion.CItem.Item);
    printf("%zu\n", sizeof x.ItemUnion.CItem.Item[0][0]);
    printf("%zu\n", sizeof x.ItemUnion.CItem.Item[0][0].TItem);

    printf("%p\n", (void*)&x.ItemUnion.CItem.Item[0][0].TItem.Ench);
    printf("%p\n", (void*)&x.ItemUnion.CItem.Item[0][0].TItem.Durability);
    printf("%p\n", (void*)&x.ItemUnion.CItem.Item[0][0].TItem.Name);
    printf("%p\n", (void*)&x.ItemUnion.CItem.Item[0][0].TItem.ID);
    printf("%p\n", (void*)&x.ItemUnion.CItem.Item[0][1].TItem.Ench);
    return 0;
}

在一个平台上,我得到:

1048
1032
1024
32
32
0x7ffcdec7ea90  // Ench
0x7ffcdec7ea98  // Durability - 8 bytes later so Ench takes 8 bytes
0x7ffcdec7eaa0  // Name - 8 bytes later so Durability takes 8 bytes
0x7ffcdec7eaa8  // ID - 8 bytes later so Name takes 8 bytes
0x7ffcdec7eab0  // Ench of next element - 8 bytes later so ID takes 8 bytes

所以我们有4 x 8字节,即32字节。其中一些可能是填充 - 很可能ID实际上只有4个字节,后跟4个字节填充。

所属标签

可能回答问题的人

  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • Richel

    8 粉丝0 提问4 回答
  • 发条丶魔灵1

    6 粉丝525 提问3 回答
  • 人生的旅途

    10 粉丝484 提问3 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励