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