我将构建一个自定义分配器,预先分配一个大块(数组)用于存储某个类T的N个元素,然后只需增加数组内的索引以处理分配请求。
由于我不希望对预分配块中的元素进行任何初始化,因此以下内容不可行:
然后,当请求分配T时(直到
我想使用此方案为STL容器定义自定义分配器。但是,对于重新绑定,我认为这里可能会有问题。事实上,如果我理解正确,STL分配器应支持从类型
那么,前面提到的
如何解决这个问题?
如何定义前面提到的
这个问题应该从不同的角度解决吗?如果是,那是什么?
由于我不希望对预分配块中的元素进行任何初始化,因此以下内容不可行:
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容器定义自定义分配器。但是,对于重新绑定,我认为这里可能会有问题。事实上,如果我理解正确,STL分配器应支持从类型
T
重新绑定到类型U
。例如,因为像std::list<T>
(或其他基于节点的容器,如std::map
)这样的容器使用分配器来分配实际上不是类型T
而是不同类型U
的节点(包含T
和其他“头”开销信息的节点)。那么,前面提到的
std::aligned_storage
方法是否适用于重新绑定?或者(正如我所想的那样),T
的正确对齐并不意味着另一种不同类型U
的正确对齐?如何解决这个问题?
如何定义前面提到的
buffer
,使其也适用于重新绑定到某些不同类型的U
?这个问题应该从不同的角度解决吗?如果是,那是什么?
std::alignment_of<std::max_align_t>::value
,以使其适合 C++ 标准分配器支持的任何类型,并正确对齐吗?当然,这对于具有特殊(更严格)对齐要求的类型不起作用(最好的例子是 SSE),但那些类型最终始终是问题,即使对于标准分配器也是如此。 - Christian Rau