处理自定义内存池中的对齐



我正在尝试创建一个内存池类,该类允许我从char*数组中返回指针,并将它们转换为各种指针。非常简化的实现:

class Mempool
{
char* mData=new char[1000];
int mCursor=0;
template <typename vtype>
vtype* New()
{
vtype* aResult=(vtype*)mData[mCursor];
mCursor+=sizeof(vtype);
return aResult;
}
};

(记住,它不是动态的,这只是随机存取存储器,我只需要很短的时间,然后它就可以全部抛出(

我的问题是:我知道在某些系统(至少是iOS(上,浮动*必须对齐。我假设对齐是通过alignof(float(获得的。。。但我永远不能确定初始char*的分配是否可以在任何地方对齐,因为alignof(char(是1。

我该怎么做才能确保在我的New((函数中,我的mCursor被推进到所请求对象的正确对齐位置?

alignof(std::max_align_t)将告诉您平台上malloc()等标准函数所需的对齐方式。如果您不知道分配器的用户将有什么对齐要求,那么您应该使用它。

当递增mCursor时,只需将sizeof(vtype)四舍五入到alignof(std::max_align_t)的最近倍数。

或者,为了提高效率,可以像现在一样增加mCursor,然后在用户请求分配时根据需要将其四舍五入。例如,当分配大小为2的对象时,您知道2字节对齐就足够了,不需要完整的alignof(std::max_align_t)。您可以使用alignof(vtype),以避免在用户相邻分配小对象时浪费空间。

对此:

我永远不能确定初始char*的分配是否对齐,因为alignof(char(是1

您可以确定:new char[N]将始终至少与alignof(std::max_align_t)对齐。但我的第二种方法(当调用New时使用pad(并不依赖于这个假设。

相关内容

  • 没有找到相关文章

最新更新