我正在盗窃我的世界,我正在使用一种结构来存储物品,仅此而已:
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形式,将其存储为数字文件,但是对于大型结构而言,没有标记足够大。
答案 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个字节的填充。