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!typePacked_Bool_Arrayisarray(1 .. 8)ofBoolean; -- 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.pragmaPack (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: 此屬性附加到結構或聯合型別定義,指定結構或聯合的每個成員(零寬度位域除外)都被放置以最大限度地減少所需的記憶體。 當附加到列舉定義時,它表示應該使用最小的整型型別。"
