gpt4 book ai didi

c - 结构是巨大的。为什么?

转载 作者:行者123 更新时间:2023-11-30 20:02:59 25 4
gpt4 key购买 nike

我正在抄袭《我的世界》,我正在使用一个结构来存储元素,就是这样:

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 对于大型结构来说足够大。

最佳答案

这个

            } Item[4][8];

是 sizeof 的 32 倍

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

int 指针位于 8 字节,double 位于 8 字节,char 指针位于 8 字节,int 位于 4 字节,以及一些未知的填充以使对齐正确,这可能是 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 个字节填充。

关于c - 结构是巨大的。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56742108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com