首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >结构是巨大的。为什么?

结构是巨大的。为什么?
EN

Stack Overflow用户
提问于 2019-06-25 02:32:50
回答 1查看 87关注 0票数 -2

我正在模仿我的世界,并且我使用了一个结构来存储项目,就是这样:

代码语言:javascript
复制
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,将其作为一个数字存储在文件中,但没有一个intager足够大,可以容纳一个庞大的结构。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-25 02:38:38

代码语言:javascript
复制
            } Item[4][8];

是大小的32倍

代码语言:javascript
复制
            struct {
                int *Ench;
                double Durability;
                char *Name;
                int ID;

其中整数指针在8字节,并且双精度在8字节,字符指针在8字节,整数在4字节,以及一些未知的填充以获得正确的对齐,其可以是32字节。因此,4x8x32是1024字节。

尝试以下代码:

代码语言:javascript
复制
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;
}

在一个平台上,我得到:

代码语言:javascript
复制
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个字节的填充。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56742108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档