小编pra*_*tib的帖子

Hinnant的short_alloc和对齐保证

我最近遇到过Howard Hinnantshort_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)

我可以想出几种方法来解决这个问题(以一些内存浪费为代价),最简单的方法是sizeallocate/deallocate函数四舍五入到多个alignment.

但在改变任何事情之前,我想确保我在这里没有遗漏一些东西......

c++ memory-management c++11

29
推荐指数
1
解决办法
3168
查看次数

标签 统计

c++ ×1

c++11 ×1

memory-management ×1