【样例 1 解释】
结构体类型 a
中,short
类型的成员 aa
占据第 字节地址,int
类型的成员 ab
占据第 字节地址。又由于其对齐要求为 字节,可得其大小为 字节。由此可同理计算出结构体类型 b
的大小为 字节,对齐要求为 字节。
【样例 2】
见选手目录下的 struct/struct2.in 与 struct/struct2.ans。
【样例 2 解释】
第二个操作 4 中,访问的内存地址恰好在为了地址对齐而留下的 “洞” 里,因此没有基本类型元素占据它。
【样例 3】
见选手目录下的 struct/struct3.in 与 struct/struct3.ans。
【数据范围】
对于全部数据,满足 ,,。
所有定义的结构体类型名、成员名称和定义的元素名称均由不超过 个字符的小写字母组成,且都不是 byte,short,int,long
(即不与基本类型重名)。
所有定义的结构体类型名和元素名称互不相同,同一结构体内成员名称互不相同。但不同的结构体可能有相同的成员名称,某结构体内的成员名称也可能与定义的结构体或元素名称相同。
保证所有操作均符合题目所述的规范和要求,即结构体的定义不会包含不存在的类型、不会访问不存在的元素或成员等。
保证任意结构体大小及定义的元素占据的最高内存地址均不超过 。
测试点 |
特殊性质 |
|
A、D |
|
A |
|
B、D |
|
B |
|
C、D |
|
C |
|
D |
|
无 |
特殊性质 A:没有操作 ;
特殊性质 B:只有一个操作 ;
特殊性质 C:所有操作 中给出的成员类型均为基本类型;
特殊性质 D:基本类型只有 long
。
【提示】
对于结构体类型的对齐要求和大小,形式化的定义方式如下:
- 设该结构体内有 个成员,其大小分别为 ,对齐要求分别为 ;
- 则该结构体的对齐要求为 ;
- 再设这些成员排布时的地址偏移量分别为 ,则:
- ;
- 对于 , 为满足 且 整除 的最小值;
- 则该结构体的大小 为满足 且 整除 的最小值;
对于定义元素时的内存排布,形式化的定义方式如下:
- 设第 个被定义的元素大小为 ,对齐要求为 ,起始地址为 ;
- 则 ,对于 , 为满足 且 整除 的最小值。