让我们定义以下Ada类型:
type Type_Huge is array (1 .. Integer'Last) of Float;
type Type_B is (foo, bar, blop, bloub);
type Type_A ( disc : Type_B := foo) is
record
case disc is
when foo =>
My_int : Integer;
when bar =>
huge_data : Type_Huge := (others => 0.0);
when others =>
null;
end case;
end record;
1-您确认以下内容吗?
my_var : Type_A;
(Type_A'Size = my_var'Size)
返回False
2- my_var'Size
的真正价值是什么?
我会说尺寸至少是:
Type_B'Size + Integer'Size
3- Type_A'Size
的价值是什么?
我想说大小是可能配置的最大值。
3-编译器是否还有其他内容(可能隐藏)添加到my_var
?
我还阅读了一些有关Value_Size
和Object_Size
的文章
但我现在还没有全面了解。
THX
答案 0 :(得分:3)
正如another answer中引用的那样,LRM要求'Size
由不确定类型的实现定义;另外,LRM M.2 (45)要求实现文档具有以下特征:
(45)
Size
对于不定子类型的含义。
如果你的编译器是GNAT,这就是它在参考手册中所说的:
不定子类型的大小是可能的最大大小, (...)。
添加编译器开关-gnatR3
时,您可以看到编译器的选择。输出还列出了'Value_Size
的数字,因为它们取决于记录判别式的值。 ((...)部分讨论了子程序参数的大小。)
答案 1 :(得分:2)
引用LRM中的第13.3节:
(44)对于每个子类型S:
(45)S'Size [...]
(48)如果S是不确定的,则意义是实现定义的。 [...]
换句话说:它是实现定义的。