簡體   English   中英

關於STL中的不相等分配器

[英]Regarding non-equal allocators in STL

我正在閱讀Scott Meyers在C ++中關於分配器的有效STL中的第10項。

標准說,允許STL的實現假定所有相同類型的分配器對象都是等效的,並且始終比較相等。

一切都很好,但是您會考慮的更多。 您越會意識到STL實現可能假定相同類型的分配器是等效的,這是多么嚴格的限制。 這意味着可移植的分配器對象(可以在不同的STL實現下正常運行的分配器)可能沒有狀態。 讓我們對此進行明確說明:這意味着可移植分配器可能沒有任何非靜態數據成員,至少沒有任何影響其行為的成員。 沒有。 納達。 舉例來說,這意味着您不能有一個從一個堆分配的SpecialAllocator和另一個從另一個堆分配的SpecialAllocator。 這樣的分配器將不等效,並且存在嘗試使用這兩個分配器可能導致運行時數據結構損壞的STL實現。

公平地說,我要指出的是,在允許STL實現者假定相同類型的分配器等效的文本之后,它立即包含以下聲明:

鼓勵實現者提供支持非相等實例的庫。 在這樣的實現中。 ...當分配器實例比較不相等時,容器和算法的語義是實現定義的。

這是一種可愛的感覺,但是作為STL的用戶,考慮開發具有狀態的自定義分配器時,它幾乎為您提供任何幫助。 僅當(1)您知道所使用的STL實現支持不等價分配器,(2)您願意深入研究其文檔以確定實現定義的行為是否為“非相等”行為時,才可以利用此語句。分配器是您可以接受的,並且

(3)您不必擔心將代碼移植到STL實現中,這些實現可能會利用標准明確規定的擴展范圍。 簡而言之,本款-第20.1.5節的第5款。 對於那些堅持知道的人來說,這是標准的分配者的“ 1擁有夢想”的演講。 在這個夢想成為現實之前,關注可移植性的程序員將自己局限於無狀態的自定義分配器。

我對以上段落的問題是

  1. 作者是指不相等或不相等的分配器?

  2. 以上文字的最后一段,即第3點,用簡單的術語表示什么?

該信息已過期。 C ++ 11和更高版本支持狀態分配器。

只有在編寫需要自定義分配器,不需要C ++ 11並支持針對未知/未指定標准庫進行構建的C ++庫時,才需要關注從有效C ++中發布的報價。 初步估算,沒有人再這樣做了。 以前這樣做的人通常擁有自己的“增強型”標准庫實現以支持有狀態的分配器,例如EASTL或BDESTL。

如果一個分配器可以釋放另一個分配器的內存,則兩個分配器應該比較相等。 因此,例如,從其所擁有的池中進行分配的分配器對象可以從該池中分配和釋放內存,但是具有不同池的其他分配器對象無法(沒有大量額外的簿記)分配已分配的內存由第一個對象。

正確執行這項工作超出了首次引入分配器時標准委員會要承擔的責任,這就是為什么這些詞如此糊塗的原因。 該許可證在最新版本的標准中已被撤銷。

最后一段意味着如果您編寫一個分配器,該分配器的對象依賴於內部狀態(例如,我上面提到的池分配器),並且您使用的庫尊重相等運算符(例如,它將不會嘗試傳遞指針在不相等的分配器之間),當您嘗試將其與不關注相等運算符的其他實現一起使用時,代碼將中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM