如何根据STL列表中的元素数量分配内存
How to allocate memory based on the number of elements in an STL list?
有一个选项可以为STL容器提供自定义分配器。然而,我找不到一种实现可以在内存池空间用完后增加内存池块大小。STL分配器如何读取列表容器的大小并自行增长块大小?
例如,块大小从1、2、4开始,依此类推,然后当容器内有1、3、7个节点时,块大小在下一次插入后立即增长。
标准容器使用提供的分配器(调用其成员函数)来分配所需的内存。相反的情况并没有发生——按照标准的规定,分配器接口中没有任何东西可以让它获得关于使用它的容器的信息。这意味着,任何自定义分配器——只要它具有与标准要求相同的接口——都无法询问容器大小。
要执行您想要的操作,您需要一个与标准分配器具有不同接口的专用分配器,以及一个知道如何与该专用分配器通信的自定义容器(例如std::list
的替代品)。试图让自定义分配器与标准容器一起工作,或者让自定义容器与标准分配器一起工作,都不会很好地工作——接口是不兼容的。
此外,您描述的行为(每次分配加倍)是特定于标准库的实现的。尽管这种分配策略有些常见,但标准并不要求这样做。其他实现是允许的,有些实现确实使用了不同的分配策略。
最后,计算/估计容器大小的上限可能会更容易,用它来计算程序需要运行多少内存,并至少安装那么多内存。
分配器通常不依赖于作为其客户端的容器类型——这将是一个循环依赖。这个循环需要通过某种不完整的类接口或类型擦除来解决。
例如,使用不完整的类指针:
struct my_pool;
template< typename t >
struct my_allocator {
my_pool * pool;
// allocate, deallocate, etc.
};
struct my_pool {
std::list< foo, my_allocator< foo > > const * client;
};
std::list< foo, my_allocator< foo > > things;
my_pool.client = & things;
在这种情况下,my_pool
依赖std::list<…, my_allocator>
依赖my_allocator<std::__list_node>
依赖my_pool
,但循环是可以的,因为几个依赖关系只是指针。
例如,使用std::function
类型擦除:
struct my_pool {
std::function< std::size_t() > client_size;
};
std::list< foo, my_allocator< foo > > things;
my_pool.client_size = [&]{ return things.size(); };
这个池甚至不需要知道容器类型。
但是,无论哪种情况,这似乎都不是特别好的设计。该池不能由其他容器共享,至少不能平等共享。
- 访问动态分配列表中的元素
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- C++ 将元素分配给映射值时访问错误
- 如何通过查找迭代器结果分配给一组对的元素
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- c++ 使用动态分配运算符反向数组元素
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 在 CPP 中将元素分配给矢量
- 如何将元素分配给向量?
- 并行算法将向量的元素分配到另一个元素的元素
- 无法在重载运算符时将数组元素分配给类变量"="
- 将字符串元素分配给结构数组中的结构
- 为每个循环中的std :: vector的当前元素分配迭代器
- OpenCV:为矩阵元素分配新值
- 将矢量元素分配给字符变量
- 如何拥有一个带有类元素的向量,其中一些元素分配了构造函数参数
- 为什么std::deque在默认构造函数中为它的元素分配内存?
- C++将字符串的元素分配给一个新字符串