我正在编写一组分配器,旨在用于非常高性能的环境中,因此稍微受限的使用(由编译器调节,而不是运行时错误)是可取的。我已经阅读了C++11状态分配器的语义以及符合容器的预期使用方式。
下面贴出一个简单的分配器,它只包含分配器对象内的一块内存。在C++03中,这是不合法的。
template <typename T, unsigned N>
class internal_allocator {
private:
unsigned char storage[N];
std::size_t cursor;
public:
typedef T value_type;
internal_allocator() : cursor(0) {}
~internal_allocator() { }
template <typename U>
internal_allocator(const internal_allocator<U>& other) {
// FIXME: What are the semantics here?
}
T* allocate(std::size_t n) {
T* ret = static_cast<T*>(&storage[cursor]);
cursor += n * sizeof(T);
if (cursor > N)
throw std::bad_alloc("Out of objects");
return ret;
}
void deallocate(T*, std::size_t) {
// Noop!
}
};
在C++11中,这可行吗?“复制有状态的分配器”是什么意思?由于目标容器调用源容器中所有元素的复制构造函数,因此分配器内部的内存是否必须显式复制,或者默认构造是否足够?
这引出了一个问题,以性能为最终目标,对于propagate_on_container_{copy, swap, move},合理的值是什么?select_on_container_copy_construction返回什么?
如果需要更多细节,请告诉我,因为这似乎是一个相当模糊的问题 - 至少对我来说如此=)
这种争议起源于这样的定义:当两个相同的分配器类型实例a == b返回true时,保证使用a分配的内存可以使用b释放。但似乎对于这个分配器永远不会成立。标准还规定,当分配器被复制构造时,例如A a(b),a == b保证返回true。