跳转到内容

Ada 编程/属性/'Size

来自 Wikibooks,开放的书籍,为开放的世界

Ada. Time-tested, safe and secure.
Ada。经久耐用,安全可靠。

R'Size 是一个 表示属性,用于获取对象或类型的位数。

  • 当应用于对象时,'Size 返回分配给存储对象的实际位数。
  • 当应用于子类型时,'Size 返回最小的 n,使得所有值都适合范围 0 .. 2n-1(仅对于正值),否则为 -2n-1 .. 2n-1-1。

'Size 属性也可以在属性定义子句中使用,以设置第一个子类型的尺寸。在特殊情况下,甚至可以通过使用小于上述 n 的值来强制使用有偏差的表示。

此子类型允许使用仅有三位数的有偏差表示,因为它只包含八个值。

 type T is range 1000 .. 1007;
 for  T'Size use 3;

如果没有大小子句,T'Size 将返回 10,因为 210-1 = 1023。

文件:attributes_size.adb (查看纯文本下载页面浏览所有)
with Ada.Text_IO;

procedure Attributes_Size is

   package T_IO renames Ada.Text_IO;
   package I_IO is new  Ada.Text_IO.Integer_IO (Integer);

   A_Boolean : constant Boolean := True;
begin
   T_IO.Put ("Size of Boolean type   = "); -- An enumeration with
   I_IO.Put (Boolean'Size);                -- 2 values fits into
   T_IO.New_Line;                          -- 1 bit.

   T_IO.Put ("Size of Boolean Object = "); -- it is more efficient
   I_IO.Put (A_Boolean'Size);              -- to store a boolean
   T_IO.New_Line;                          -- as an entire byte
end Attributes_Size;

使用 GNAT 10.2.0 的输出将是

Size of Boolean type   =           1
Size of Boolean Object =           8

自己尝试一下,看看你的编译器是如何做的。

Size 的值也可以使用属性定义子句指定。例如,以下声明指定了与 C99 兼容的 bool

type Bool is new Boolean; 
for Bool'Size use Interfaces.C.int'Size;

错误用法

[编辑 | 编辑源代码]

一个常见的 Ada 编程错误是假设为类型 T 指定 'Size 会强制编译器为这种类型的对象分配正好这个数量的位。这不是真的。指定的 T'Size 将强制编译器在打包数组和记录的组件中以及在 Unchecked_Conversion 中使用此大小,但编译器仍然可以自由地为独立对象分配更多位。

在对象本身使用 'Size 来强制对象使用指定的值。

另请参阅

[编辑 | 编辑源代码]

Ada 83 参考手册

[编辑 | 编辑源代码]

Ada 95 参考手册

[编辑 | 编辑源代码]

Ada 2005 参考手册

[编辑 | 编辑源代码]

Ada 2012 参考手册

[编辑 | 编辑源代码]
华夏公益教科书