我最近遇到过Howard Hinnant的short_alloc,这是我见过的自定义分配器的最佳例子.
但是当我花费更多时间研究代码以将其集成到我的个人项目中时,我发现arena提供基于堆栈的分配的类可能并不总是返回正确对齐的内存.实际上,我担心只有第一次分配才能保证适当对齐(因为缓冲区本身具有强制对齐),请参阅下面的相关代码片段:
template <std::size_t N>
class arena
{
static const std::size_t alignment = 16;
alignas(alignment) char buf_[N];
char* ptr_;
//...
};
template <std::size_t N>
char*
arena<N>::allocate(std::size_t n)
{
assert(pointer_in_buffer(ptr_) && "short_alloc has outlived arena");
if (buf_ + N - ptr_ >= n)
{
char* r = ptr_;
ptr_ += n;
return r;
}
return static_cast<char*>(::operator new(n));
}
Run Code Online (Sandbox Code Playgroud)
我可以想出几种方法来解决这个问题(以一些内存浪费为代价),最简单的方法是size将allocate/deallocate函数四舍五入到多个alignment.
但在改变任何事情之前,我想确保我在这里没有遗漏一些东西......