Ada 编程/编译指示/Pack
外观
pragma Pack (local_name);
Pack 是一个表示 编译指示,它指示编译器使用有利于节省存储空间而不是易于访问的类型表示。它可以用于复合类型,例如数组和记录。使用 Pack 编译指示通常会导致更小的数据结构,但需要额外的操作来检索每个元素(可能需要位操作才能检索打包的数据)。这可能会或可能不会导致执行时间的损失,因为访问每个元素而执行的指令增加可能比从内存读取未打包数据结构的成本更便宜。[1]
-- A boolean is typically stored in a byte by the compiler, not a bit -- An array of eight booleans will therefore occupy 64 bits, not 8!type
Packed_Bool_Arrayis
array
(1 .. 8)of
Boolean; -- With pragma pack, the compiler will try to compress the entire array, -- in this case probably into a single byte (but this is not guaranteed). -- Accessing one of these booleans, however, will require bit operations.pragma
Pack (Packed_Bool_Array);
重要的是要认识到pragma Pack 不应该用于指定数据类型的精确表示,而是帮助编译器提高生成代码的效率。[2] 编译器可以自由地忽略编译指示,因此如果需要类型的特定表示,则应使用 表示子句(记录表示子句,以及/或属性 'Size 或 'Component_Size)。
虽然在 Ada 83 中,打包布尔数组用于按位操作,[3] 但从 Ada 95 开始,模类型更适合这些操作。[4] 可以将该论点与命名布尔数组索引的优点进行权衡,例如Traffic_Lights'(Red => True,others
=> False),取决于用例。
Pack 编译指示自 Ada 83 起成为语言的标准。但是,允许实现产生不同的结果或完全忽略它,因此它在编译器之间不可移植。它也会根据目标架构产生不同的结果。因此,pragma Pack 不应在需要类型的精确表示时使用。
据作者所知,其他编程语言中没有等效的标准特性,因此在接口时不应使用此编译指示。
GCC 为 C 编程语言提供了一种扩展,可用于打包结构、联合(相当于 Ada 的记录)或枚举类型。[5] 请注意packed属性不是 C 语言的标准特性,不能像在 Ada 中那样与数组一起使用。
- Ada 编程
- Ada 编程/编译指示
- Ada 编程/编译指示/Optimize
- Ada 编程/编译指示/Implicit_Packing(实现定义的)
- Ada 编程/属性/'Size
- Ada 编程/属性/'Component_Size
- Ada 编程/类型/mod
- ↑ Robert A. Duff (2007-07-09). "针对打包布尔数组的次优代码 - 错误还是固有局限性?". comp.lang.ada. (网络链接). 于 2008-05-27 检索.
- ↑ Adam Beneschan (2008-01-09). "Pragma Pack 与 Convention C,可移植性问题?". comp.lang.ada. (网络链接). 于 2008-05-27 检索.
- ↑ 软件生产力联盟 (1995 年 10 月). Ada 95 质量和风格指南, "10.5.7 打包布尔数组的移位"
- ↑ 软件生产力联盟 (1995 年 10 月). Ada 95 质量和风格指南, "10.6.3 模块类型上的位运算"
- ↑ 自由软件基金会. "5.35 指定类型属性 - packed". 使用 GNU 编译器集合 (GCC). http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html. 检索于 2008-11-23. "packed: 此属性附加到结构或联合类型定义,指定结构或联合的每个成员(零宽度位域除外)都被放置以最大限度地减少所需的内存。 当附加到枚举定义时,它表示应该使用最小的整型类型。"