C++ 在动态字符数组中存储不同大小的对象(对齐?)

C++ 在动态字符数组中存储不同大小的对象(对齐?),c++,arrays,memory,char,C++,Arrays,Memory,Char,我正在制作一个内存池实现,它可以存储某些模板类型T的派生类型的对象。当前的实现在这里(有趣的类在底部,BaseMemoryPool): 我没有在这里发布代码,因为我要问的主要问题太长了;如何安全地(关于对齐、块对齐等)将动态分配的char数组的某些部分强制转换为模板类型U 我试图做的一个草图: template <typename U> U *setAndReturnPointer(U &&object, char *storage, size_t storageLe

我正在制作一个内存池实现,它可以存储某些模板类型
T
的派生类型的对象。当前的实现在这里(有趣的类在底部,
BaseMemoryPool
):

我没有在这里发布代码,因为我要问的主要问题太长了;如何安全地(关于对齐、块对齐等)将动态分配的
char
数组的某些部分强制转换为模板类型
U

我试图做的一个草图:

template <typename U>
U *setAndReturnPointer(U &&object, char *storage, size_t storageLength, size_t byteOffset) {
    static_assert(std::is_base_of<Base, typename std::decay<U>::type>::value, "item must be of or derived of type Base");
    assert(byteOffset + sizeof(U) <= storageLength);

    U *ptr = reinterpret_cast<U*>(&storage[byteOffset]);
    *ptr = std::forward<U>(item);
    return ptr;
}
模板
U*设置和返回指针(U&&对象、字符*存储、大小\U t存储长度、大小\U t字节偏移量){
static_assert(std::is_base_of::value,“项必须为base类型或派生为base类型”);

assert(byteOffset+sizeof(U)为
std::align
给出的示例完美地回答了我的问题,并教会了我更多关于对齐工作原理的知识


如果不调用构造函数,看起来你也会被踢到……我想用item
item
初始化的内存区域不是吗?还是说另一个构造函数?不是,
*ptr=std::forward(item)在代码< > *PTR <代码>中已经存在一个对象,调用它的赋值操作符,而不是构造函数。Bombax,这是一个有风险的事务。例如,考虑一个包含代码成员>代码> STR 的<代码> U/COD>。<代码> STR <代码>=代码>源。STR 是注定的,因为<代码> STR < /代码>从来没有正确初始化。知道
source.str
将被复制到何处。谢谢你们两位的评论。我现在已经阅读了关于“placement new”的内容,这似乎非常复杂,因为我必须手动调用析构函数。也许最好搜索现有的实现。