[英]STL Containers, SBO and custom allocator conflicts
我最近一直在努力開發基於內存池的自定義分配器,它在分配器的多個實例之間共享。
目的是分配器與STL和基於標准C ++的容器兼容,例如vector,deque,map,string等
然而,特別是某些事情讓我有些困惑。 容器的各種實現(例如std :: vector , std :: string)使用小緩沖區優化 - 基於堆棧的分配用於小的初始內存需求。
例如,MSVC9.1在basic_string類中具有以下成員:
union _Bxty
{ // storage for small buffer or pointer to larger one
_Elem _Buf[_BUF_SIZE];
_Elem *_Ptr;
char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;
我無法看到在實例化這樣的容器時,如何只能實現並始終使用提供的分配器而不使用SBO。 我問,因為實現自定義分配器的意圖之一是能夠在共享內存上下文中使用它們,其中共享內存的數量可能小於各種實現可能使用的SBO限制。
例如,我想有一種情況,我可以有兩個std :: string實例,每個進程共享一個公共內存塊,可能小於或等於SBO上限。
可能相關: 5月std :: vector使用小緩沖區優化?
typedef std::vector<int,mysharedmemallocator> shmvtype;
shmvtype v(2,0); //<-- if SBO then error as memory is allocated on
//stack not via the allocator
v[1] = 1234; //<-- if SBO then error as wrong piece of memory
// is being modified.
讓我們看看另一個不基於共享內存的示例,因為它似乎使某些人的事情變得復雜。 讓我說我想專門化我的std :: basic_string或std :: vector等一個分配器,它在將指針呈現給調用實體之前填充它分配的值為0xAB,而不是奇思妙想。
專門使用此新分配器但也使用SBO的容器將不會使其基於SBO的內存填充0xAB模式。 例如:
typedef std::basic_string<char,myfillmemallocator> stype
stype s;
s.resize(2);
assert(s[0] == 0xAB); // if SBO this will fail.
實現自定義分配器的意圖之一是能夠在共享內存上下文中使用它們
這可能是你打算用它做的,但這並不是它們存在的原因。 實際上,除了C ++ basic_string
中的basic_string
之外,在對象之間共享分配的內存是不合法的。 他們可以共享分配器對象,因此他們可以從同一個地方獲取內存。 但修改一個對象以影響另一個不相關的對象是違法的; 每個實例必須是分開的。
寫時復制字符串僅起作用,因為系統假定對字符的任何非const訪問都將寫入,從而執行復制。 在C ++ 11中,甚至禁止使用basic_string
來執行這樣的copy-on-write風格的東西。
例如,我想有一種情況,我可以有兩個std :: string實例,每個進程共享一個公共內存塊,可能小於或等於SBO上限。
沒有寫自己的課,這是不可能的。 分配器僅控制內存的來源。 你想要的是一個有保證的寫時復制字符串或某種共享字符串類。
您想要的是需要專門為此目的設計的容器類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.