我将构建一个自定义分配器,预先分配一个大块(数组)来存储N某个类的元素T,然后在数组内增加一个索引来服务分配请求。
由于我不希望对预分配块中的元素进行任何初始化,因此这样的事情将不起作用:
T buffer[N];
因为在这种情况下T,将为N块的元素调用 的构造函数。
由于我的理解是std::aligned_storage不调用T构造函数,所以我想到了使用std::aligned_storage,如下所示:
std::aligned_storage<
N * sizeof(T),
std::alignment_of<T>::value
>::type buffer;
T* base = static_cast<T*>( static_cast<void*>(&buffer) );
然后分配器可以在请求分配 T 时(直到(base+N))增加基指针,并且可以在需要时在适当的位置(使用放置new)构造 T。
我想使用这个方案为 STL 容器定义一个自定义分配器。但是,在我看来, rebinding可能存在问题。事实上,如果我的理解是正确的,STL 分配器应该支持从 type 重新绑定T到 type U,例如因为容器std::list<T>(或其他基于节点的容器std::map)使用分配器来分配实际上不是 type 的节点T,但不同的节点类型U(包含T节点的其他“标头”开销信息)。那么,上述std::aligned_storage方法是否适用于重新绑定?或者(我认为)Ts的正确对齐不会暗示另一种不同类型的正确对齐U?
如何解决这个问题?
我如何定义上述buffer内容以使其也适用于重新绑定到某些不同类型U?
是否应该从不同的角度来解决这个问题?如果是这样,是什么?