在Ada语言的判别式记录类型(discriminated record type)中,包含了被称为判别器(discriminant)的元件(component),以及依赖判别器的记录分量(component)。
依赖判别器的记录分量构成了该记录类型的变体(variant)部分,即这部分数据实际所占用的内存大小取决于声明该类型的变量时的判别器的实际值。
如果在这类记录的变体后面还有其他记录分量,那么这些记录分量在该记录中的偏移量不是一个常数,而是一个需要计算的变量。
在Ada编译器生成的目标码中可以看到,被编译的源代码中对后续记录分量的访问操作都增加了计算偏移量的目标码。
笔者在解读某个大型软件时,看到了上述问题的一个实例。由于变体部分后面的记录分量被频繁访问,所产生的额外的时空开销是比较可观的。
因此,变体部分要放在判别式记录类型声明的底部。