gpt4 book ai didi

c++ - STL 容器、SBO 和自定义分配器冲突

转载 作者:可可西里 更新时间:2023-11-01 18:37:07 31 4
gpt4 key购买 nike

我最近一直在尝试开发一个基于内存池的自定义分配器,该内存池在分配器的多个实例之间共享。

目的是让分配器与基于 STL 和标准 C++ 的容器兼容,例如 vector、deque、map、string 等

但是有一些特别的事情让我有些困惑。 std::vectorstd::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 的实例共享一个公共(public) block 可能小于或等于 SBO 上限的内存限制。

可能相关:May std::vector make use of small buffer optimization?

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 的容器将不会使用 0xAB 模式填充其基于 SBO 的内存。例如:

typedef std::basic_string<char,myfillmemallocator> stype

stype s;
s.resize(2);

assert(s[0] == 0xAB); // if SBO this will fail.

最佳答案

one of intentions of implementing custom allocators was to be able to use them in a shared memory context

这可能是您打算用它做的,但这不是它们存在的原因。实际上,除了 C++98/03 中的 basic_string 之外,在对象之间共享分配的内存是完全不合法的。它们可以共享分配器对象,因此它们可以从同一个地方获取内存。但是修改一个对象影响另一个不相关的对象是非法的;每个实例必须是独立的。

写时复制字符串之所以有效,是因为系统假定对字符的任何非常量访问都会写入它,从而执行复制。在 C++11 中,甚至 basic_string 也被禁止做这样的写时复制风格的事情。

For example I would like to have a situation where I can have two instances of std::string one per process sharing a common block of memory which maybe smaller than or equal to the SBO upper limit.

如果不编写自己的类,这是不可能的。分配器只控制内存的来源。您需要的是有保证的写时复制字符串或某种共享字符串类。

您需要一个专门为此目的设计的容器类。

关于c++ - STL 容器、SBO 和自定义分配器冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13677646/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com