我将构建一个自定义分配器,预先分配一个大块(数组)来存储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
方法是否适用于重新绑定?或者(我认为)T
s的正确对齐不会暗示另一种不同类型的正确对齐U
?
如何解决这个问题?
我如何定义上述buffer
内容以使其也适用于重新绑定到某些不同类型U
?
是否应该从不同的角度来解决这个问题?如果是这样,是什么?