在 C++ 等高级语言中,除了 int 和 float 等基本类型外,通常还可以自定义结构体类型。在本题当中,你需要模拟一种类似 C++ 的高级语言的结构体定义方式,并计算出相应的内存占用等信息。
在这种语言中,基本类型共有 4 种:byte,short,int,long,分别占据 1, 2, 4, 8 字节的空间。
定义一个结构体类型时,需要给出类型名和成员,其中每个成员需要按顺序给出类型和名称。类型可以为基本类型,也可以为先前定义过的结构体类型。注意,定义结构体类型时不会定义具体元素,即不占用内存。
定义一个元素时,需要给出元素的类型和名称。元素将按照以下规则占据内存:
以下是一个例子(以 C++ 语言的格式书写):
struct d {
short a;
int b;
short c;
};
d e;
该代码定义了结构体类型 d 与元素 e。元素 e 包含三个成员 e.a, e.b, e.c,分别占据第 0 ∼ 1,4 ∼ 7,8 ∼ 9 字节的地址。由于类型 d 需要对齐到 4 字节,因此 e 占据了第 0 ∼ 11 字节的地址,大小为 12 字节。
你需要处理 n 次操作,每次操作为以下四种之一:
输出到文件 'struct.out' 中。
输出 $$$n$$$ 行,依次表示每个操作的输出结果,输出要求如题目描述中所述。
51 a 2short aaint ab1 b 2a balong bb2 b x3 x.ba.ab4 10
8 4 16 8 0 4 x.bb
101 a 4int aashort ablong acbyte ad1 b 4a baint bbshort bca bd2 b x2 a y3 x.bd.ab3 x.ba3 y.ac4 424 204 100
24 8 56 8 0 56 36 0 64 x.bd.ac ERR ERR
【样例 1 解释】
结构体类型 a 中,int 类型的成员 aa 占据第 0 ∼ 3 字节地址,short 类型的成员 ab 占据第 4 ∼ 5 字节地址。又由于其对齐要求为 4 字节,可得其大小为 8 字节。由此可同理计算出结构体类型 b 的大小为 16 字节,对齐要求为 8 字节。
【样例 2 解释】
第二个操作 4 中,访问的内存地址恰好在为了地址对齐而留下的"洞"里,因此没有基本类型元素占据它。
【数据范围】
对于全部数据,满足 $$$1\leq n\leq 100$$$,$$$1\leq k\leq 100$$$,$$$0\leq addr\leq 10^{18}$$$。
所有定义的结构体类型名、成员名称和定义的元素名称均由不超过 10 个字符的小写字母组成,且都不是 byte,short,int,long(即不与基本类型重名)。
所有定义的结构体类型名和元素名称互不相同,同一结构体内成员名称互不相同。但不同的结构体可能有相同的成员名称,某结构体内的成员名称也可能与定义的结构体或元素名称相同。
保证所有操作均符合题目所述的规范和要求,即结构体的定义不会包含不存在的类型、不会访问不存在的元素或成员等。
保证任意结构体大小及定义的元素占据的最高内存地址均不超过 $$$10^{18}$$$。
【提示】
对于结构体类型的对齐要求和大小,形式化的定义方式如下:
对于定义元素时的内存排布,形式化的定义方式如下: