我可以编写自定义分配器来决定 std::vector 的重新分配量吗?
Can I write a custom allocator to decide the reallocation amount of std::vector?
据我了解,自定义分配器必须符合 Allocator Concept 的要求。但是,基于该界面,我看不出当向量 运行 超出储备时我将如何选择新的分配量。
例如,在 push_back()
期间,每次超过 reserve
时,我机器上的当前实现都会加倍分配大小。我想提供一个缓慢且具有内存意识的自定义分配器。它只会分配之前的 capacity+1
来容纳新元素。
这些是我正在查看的概念的接口:
a.allocate(n)
a.allocate(n, cvptr) (optional)
我做了一个像这样的工作样板分配器:
#include <limits>
#include <iostream>
template <class T> class MyAlloc {
public:
// type definitions
typedef T value_type;
typedef T *pointer;
typedef const T *const_pointer;
typedef T &reference;
typedef const T &const_reference;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
pointer address(reference value) const {
return &value;
}
const_pointer address(const_reference value) const {
return &value;
}
size_type max_size() const throw() {
return std::numeric_limits<std::size_t>::max() / sizeof(T);
}
pointer allocate(size_type num, const void * = 0) {
return (pointer)(::operator new(num * sizeof(T)));
}
void construct(pointer p, const T &value) {
new ((void *)p) T(value);
}
void destroy(pointer p) {
p->~T();
}
void deallocate(pointer p, size_type num) {
::operator delete((void *)p);
}
};
查看 allocate
函数:
pointer allocate(size_type num, const void * = 0) {
return (pointer)(::operator new(num * sizeof(T)));
}
我可以在这里分配更多或更少的内存,但我没有看到一种方法可以将其报告回 vector 以便它知道其当前容量是多少。
也许这不属于分配器的职责范围?
C++继承的STL模型是基于容器和分配器的特定划分。分配器的目的是提供某人请求的内存。关于分配多少内存的决定完全取决于容器,而不考虑它使用哪个分配器来提供该内存。
这就是 C++ 使用的模型。您可以编写自己的类似于 vector
的容器,允许其分配器指定应分配多少。但除此之外,没有。
据我了解,自定义分配器必须符合 Allocator Concept 的要求。但是,基于该界面,我看不出当向量 运行 超出储备时我将如何选择新的分配量。
例如,在 push_back()
期间,每次超过 reserve
时,我机器上的当前实现都会加倍分配大小。我想提供一个缓慢且具有内存意识的自定义分配器。它只会分配之前的 capacity+1
来容纳新元素。
这些是我正在查看的概念的接口:
a.allocate(n)
a.allocate(n, cvptr) (optional)
我做了一个像这样的工作样板分配器:
#include <limits>
#include <iostream>
template <class T> class MyAlloc {
public:
// type definitions
typedef T value_type;
typedef T *pointer;
typedef const T *const_pointer;
typedef T &reference;
typedef const T &const_reference;
typedef std::size_t size_type;
typedef std::ptrdiff_t difference_type;
pointer address(reference value) const {
return &value;
}
const_pointer address(const_reference value) const {
return &value;
}
size_type max_size() const throw() {
return std::numeric_limits<std::size_t>::max() / sizeof(T);
}
pointer allocate(size_type num, const void * = 0) {
return (pointer)(::operator new(num * sizeof(T)));
}
void construct(pointer p, const T &value) {
new ((void *)p) T(value);
}
void destroy(pointer p) {
p->~T();
}
void deallocate(pointer p, size_type num) {
::operator delete((void *)p);
}
};
查看 allocate
函数:
pointer allocate(size_type num, const void * = 0) {
return (pointer)(::operator new(num * sizeof(T)));
}
我可以在这里分配更多或更少的内存,但我没有看到一种方法可以将其报告回 vector 以便它知道其当前容量是多少。
也许这不属于分配器的职责范围?
C++继承的STL模型是基于容器和分配器的特定划分。分配器的目的是提供某人请求的内存。关于分配多少内存的决定完全取决于容器,而不考虑它使用哪个分配器来提供该内存。
这就是 C++ 使用的模型。您可以编写自己的类似于 vector
的容器,允许其分配器指定应分配多少。但除此之外,没有。