我的思考
仅自己可见 · 自动保存到账号,可在其他设备继续查看
1 秒 / 测试点 · 512 MiB
在 C++ 等高级语言中,除了 int 和 float 等基本类型外,通常还可以自定义结构体类型。在本题当中,你需要模拟一种类似 C++ 的高级语言的结构体定义方式,并计算出相应的内存占用等信息。
在这种语言中,基本类型共有 $4$ 种:byte、short、int、long,分别占据 $1$、$2$、$4$、$8$ 字节的空间。
定义一个结构体类型时,需要给出类型名和成员,其中每个成员需要按顺序给出类型和名称。类型可以为基本类型,也可以为先前定义过的结构体类型。注意,定义结构体类型时不会定义具体元素,即不占用内存。
定义一个元素时,需要给出元素的类型和名称。元素将按照以下规则占据内存:
int 类型需要对齐到 $4$ 字节,其余同理。int 和 short 的结构体类型需要对齐到 $4$ 字节。以下是一个例子(以 C++ 语言的格式书写):
struct d {
short a;
int b;
short c;
};
d e;
该代码定义了结构体类型 d 与元素 e。元素 e 包含三个成员 e.a、e.b、e.c,分别占据第 $0 \sim 1$、$4 \sim 7$、$8 \sim 9$ 字节的地址。由于类型 d 需要对齐到 $4$ 字节,因此 e 占据了第 $0 \sim 11$ 字节的地址,大小为 $12$ 字节。
你需要处理 $n$ 次操作,每次操作为以下四种之一:
. 来访问结构体类型的成员。如 a.b.c,表示 a 是一个已定义的元素,它是一个结构体类型,有一个名称为 b 的成员,它也是一个结构体类型,有一个名称为 c 的成员。你需要输出如上被访问的最内层元素的起始地址。ERR。第 $1$ 行:一个正整数 $n$,表示操作的数量。
接下来若干行,依次描述每个操作,每行第一个正整数 $op$ 表示操作类型:
输出 $n$ 行,依次表示每个操作的输出结果,输出要求如题目描述中所述。
5
1 a 2
short aa
int ab
1 b 2
a ba
long bb
2 b x
3 x.ba.ab
4 10
8 4
16 8
0
4
x.bb
结构体类型 a 中,short 类型的成员 aa 占据第 $0 \sim 1$ 字节地址,int 类型的成员 ab 占据第 $4 \sim 7$ 字节地址。又由于其对齐要求为 $4$ 字节,可得其大小为 $8$ 字节。由此可同理计算出结构体类型 b 的大小为 $16$ 字节,对齐要求为 $8$ 字节。
见选手目录下的 struct/struct2.in 与 struct/struct2.ans。
第二个操作 4 中,访问的内存地址恰好在为了地址对齐而留下的 “洞” 里,因此没有基本类型元素占据它。
见选手目录下的 struct/struct3.in 与 struct/struct3.ans。
对于全部数据,满足 $1 \le n \le 100$,$1 \le k \le 100$,$0 \le addr \le 10^{18}$。
所有定义的结构体类型名、成员名称和定义的元素名称均由不超过 $10$ 个字符的小写字母组成,且都不是 byte,short,int,long(即不与基本类型重名)。
所有定义的结构体类型名和元素名称互不相同,同一结构体内成员名称互不相同。但不同的结构体可能有相同的成员名称,某结构体内的成员名称也可能与定义的结构体或元素名称相同。
保证所有操作均符合题目所述的规范和要求,即结构体的定义不会包含不存在的类型、不会访问不存在的元素或成员等。
保证任意结构体大小及定义的元素占据的最高内存地址均不超过 $10^{18}$。
| 测试点 | 特殊性质 |
|---|---|
| $1$ | A、D |
| $2\sim 3$ | A |
| $4\sim 5$ | B、D |
| $6\sim 8$ | B |
| $9\sim 10$ | C、D |
| $11\sim 13$ | C |
| $14\sim 16$ | D |
| $17\sim 20$ | 无 |
特殊性质 A:没有操作 $1$;
特殊性质 B:只有一个操作 $1$;
特殊性质 C:所有操作 $1$ 中给出的成员类型均为基本类型;
特殊性质 D:基本类型只有 long。
对于结构体类型的对齐要求和大小,形式化的定义方式如下:
对于定义元素时的内存排布,形式化的定义方式如下:
题目可直接阅读。页面加载后可编写 C++ 代码、运行样例并提交在线评测。
不限时,可逐题在网页作答、提交评测。
知识点、难度与考点提示为本站编辑标注,用于按专题组卷练习;点击题目进入原卷作答环境。
仅自己可见 · 自动保存到账号,可在其他设备继续查看