我刚刚完成了一个关于重写new和delete运算符的个人项目,并且开始学习此过程中的分配器类。阅读了包括cppreference.com在内的几个在线引用资料后,我注意到许多功能被描述为可选功能。
我的问题是分配器接收者如何std::set
,如果其接收到的分配器仅可选地实现函数和类型,则可以工作吗?
我会理解,是否需要分配器从某个具有所有功能默认实现的基类派生,但是似乎没有分配器的继承要求。
还是因为编译错误而使人警觉到需要实现这些可选功能?
作为引用,这是我第一次尝试使用分配器,该分配器用作std::set
的第三个模板参数。我处理了一个现有示例,因此我相信我实现的大部分内容可能都是不必要的,但是我还不了解如果将来选择与其他STL容器一起使用分配器,那么如何判断是必要的。除非再次期望是根据编译错误来解决...?
template <typename T>
class Allocator // Custom allocator for use by AllocSet::mAllocatedPtrs to avoid infinite recursion
{ // (because inserting an element in std::set calls ::operator new, which is overridden to add to AllocSet::mAllocatedPtrs).
public:
typedef T value_type;
typedef T* pointer;
typedef T& reference;
typedef const T* const_pointer;
typedef const T& const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
template <typename U>
struct rebind { typedef Allocator<U> other; };
Allocator() { }
template <typename U> Allocator(const Allocator<U>&) { }
virtual ~Allocator() { }
pointer allocate(size_t numT) { return (T*)(malloc(numT * sizeof(T))); }
void deallocate(pointer p, size_type st) { free(p); }
size_type max_size() { return size_type(-1); }
reference operator=(const_reference) { return *this; }
template <typename U> reference operator=(const Allocator<U>&) { return *this; }
template <typename U> bool operator==(const Allocator<U>&) { return true; }
template <typename U> bool operator!=(const Allocator<U>&) { return false; }
pointer address(reference r) { return &r; }
const_pointer address(const_reference r) { return &r; }
};
最佳答案
如果您查看the allocator concecpt:
这也是为什么这么多东西是可选的-大多数分配器实现确实不需要更改它们的原因,那么为什么要打扰呢?假设您有一个新的内存重组算法的想法,为什么您需要定义pointer
?
不,分配器的概念是well defined。它指定了您必须提供的内容以及可以提供的内容。无需依赖编译错误。
您可以在the standard,$ 17.6.3.5中找到要求。
关于c++ - 为什么许多分配器功能是可选的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39405014/