我试图实现自己的小型分配器用于测试目的,在设计它时我认为我不知道如何在不违反严格别名规则的情况下实现它。
在大多数 [github 开源] C++ 分配器中,方法
allocate<T>
是内存适配器:它运行到内存,请求 N
连续的 std::byte
或 unsigned char
,然后 reinterpret_cast
将此记忆传给T
,然后将记忆返回给它的被调用者。
但是,这如何不违反严格的别名规则(即使 calee 必须调用构造函数本身,我们将
std::byte*
转换为 T*
)。在实现适合大多数 STL 容器的简单缓冲区分配器时,如何解决这个问题?
std::allocator<T>::allocate
不会构造任何 T
1 类型的对象,std::construct_at
会构造。如果您继续在指向的内存中开始 reinterpret_cast
的生命周期,那么可以从 void *
到 T *
到 T
。
allocate
确实启动了 T
数组的生命周期,但不启动该数组的 T
子对象。