结构体
题目描述:
在 C++ 等高级语言中,除了 int 和 float 等基本类型外,通常还可以自定义结构体类型。在本题当中,你需要模拟一种类似 C++ 的高级语言的结构体定义方式,并计算出相应的内存占用等信息。
在这种语言中,基本类型共有
定义一个结构体**类型**时,需要给出**类型名**和**成员**,其中每个成员需要按顺序给出**类型**和**名称**。类型可以为基本类型,也可以为**先前定义过**的结构体类型。注意,定义结构体**类型**时不会定义具体元素,即不占用内存。
定义一个**元素**时,需要给出元素的**类型**和**名称**。元素将按照以下规则占据内存:
- 元素内的所有成员将按照**定义时给出的顺序**在内存中排布,对于类型为结构体的成员同理。
- 为了保证内存访问的效率,元素的地址占用需要满足**对齐规则**,即任何类型的**大小**和该类型元素在内存中的**起始地址**均应对齐到该类型对齐要求的**整数倍**。具体而言:
- 对于基本类型:对齐要求等于其占据空间大小,如 `int` 类型需要对齐到
- 对于结构体类型:对齐要求等于其成员的对齐要求的**最大值**,如一个含有 `int` 和 `short` 的结构体类型需要对齐到
以下是一个例子(以 C++ 语言的格式书写):
该代码定义了结构体类型 `d` 与元素 `e`。元素 `e` 包含三个成员 `e.a`、`e.b`、`e.c`,分别占据第
你需要处理
1. 定义一个结构体类型。具体而言,给定正整数
2. 定义一个元素,具体而言,给定字符串
3. 访问某个元素。具体而言,给定字符串
4. 访问某个内存地址。具体而言,给定非负整数
输入格式:
第
接下来若干行,依次描述每个操作,每行第一个正整数
- 若
- 若
- 若
- 若
输出格式:
输出
样例输入:
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
提示:
【样例 1 解释】
结构体类型 `a` 中,`short` 类型的成员 `aa` 占据第
【样例 2 解释】
第二个操作 4 中,访问的内存地址恰好在为了地址对齐而留下的 “洞” 里,因此没有基本类型元素占据它。
【数据范围】
对于全部数据,满足
所有定义的结构体类型名、成员名称和定义的元素名称均由不超过
所有定义的结构体类型名和元素名称互不相同,同一结构体内成员名称互不相同。但不同的结构体可能有相同的成员名称,某结构体内的成员名称也可能与定义的结构体或元素名称相同。
保证所有操作均符合题目所述的规范和要求,即结构体的定义不会包含不存在的类型、不会访问不存在的元素或成员等。
保证任意结构体大小及定义的元素占据的最高内存地址均不超过
| 测试点 | 特殊性质 |
| :----------: | :----------: |
|
|
|
|
|
|
|
|
特殊性质 A:没有操作
特殊性质 B:只有一个操作
特殊性质 C:所有操作
特殊性质 D:基本类型只有 `long`。
【提示】
对于结构体类型的对齐要求和大小,形式化的定义方式如下:
- 设该结构体内有
- 则该结构体的对齐要求为
- 再设这些成员排布时的**地址偏移量**分别为
-
- 对于
- 则该结构体的大小
对于定义元素时的内存排布,形式化的定义方式如下:
- 设第
- 则
空间限制: 512MB
来源: CSP2023提高T3