结构是巨大的。为什么?

时间:2019-06-24 18:32:49

标签: c struct sizeof

我正在盗窃我的世界,我正在使用一种结构来存储物品,仅此而已:

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形式,将其存储为数字文件,但是对于大型结构而言,没有标记足够大。

1 个答案:

答案 0 :(得分:3)

from win32com import client
import time

word = client.Dispatch("Word.Application")

def printWordDocument(filename):

    word.Documents.Open(filename)
    word.ActiveDocument.PrintOut()
    time.sleep(2)
    word.ActiveDocument.Close()

word.Quit()

是sizeof

的32倍
            } Item[4][8];

int指针为8字节,double指针为8字节,char指针为8字节,int指针为4字节,并加上一些未知的填充以使对齐正确,可能是32字节。所以4 x 8 x 32是1024字节。

尝试以下代码:

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

在一个平台上,我得到:

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;
}

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