这种内存管理有用例吗?

时间:2017-01-15 22:40:31

标签: c++ memory-management data-structures

我在Reddit的“learnprogramming”子(source)中找到了这段代码。

作者声称它对于某些未声明的用例是最佳的。但我个人无法想到一个。我倾向于同意其他一些评论说这看起来很像动态内存分配的海报,除了它是在固定大小的对象内部而不是在系统堆上完成的。但我愿意保持开放的心态,并考虑到我可能忽略了一个奇怪的用例。

那么,实际上是否存在这种类型对象的用例,其中“停放汽车”(分配对象)比直接在运行时堆栈或堆上分配它们更好?

template <typename T, size_t SIZE>
class CarPark {

  public:
    CarPark() {
      // Setup initial free spaces
      for (size_t i = SIZE; i > 0; --i) {
        mFreeSpaces.push(i - 1);
      }
    }

    const size_t& Park(const T* const t) {
      size_t ticket = mFreeSpaces.top();
      mSpaces.at(ticket) = t;
      mFreeSpaces.pop();
      return ticket;
    }

    const T* const DePark(size_t ticket) {
      const T* const result = mSpaces.at(ticket);
      mSpaces.at(ticket) = nullptr;
      mFreeSpaces.push(ticket);
      return result;
    }

  private:
    std::array<const T*, SIZE> mSpaces { { nullptr } };
    std::stack<size_t> mFreeSpaces;

};

1 个答案:

答案 0 :(得分:1)

CarPark为空格预分配恒定数量的连续字节。 我至少可以看到两个用例:

1&GT;空间位置:...至少对于汽车的空间(参见注释)如果CarPark将汽车直接放入空间,可能会有以下好处:而不是将您的汽车存储在堆内存中的伪随机位置空间,所有汽车将被紧紧地包装在一起,这意味着迭代所有汽车或释放存储空间将是快速的。这将是缓存友好的。

2 - ;可能的多线程应用程序:根据我的理解,默认分配器对于多程序编程不是很友好(如果我错了,请纠正我。我基于我对C的经验这一点。)分配器必须等待单个内存请求是在接受任何其他请求之前完成,所以如果你想使用多个线程停放某些汽车,那就没有意义了。由于所有分配都是事先完成的,因此多个线程可以停放汽车(当然,您必须实现必要的多线程安全部分),而不是等待分配器完成请求。

3&GT;见评论:

  

在分配开销很大的情况下,管理固定   本地大小元素可以更有效。   en.wikipedia.org/wiki/Slab_allocation - Rich

在理想情况下,您会知道程序平均(或确切)需要停放多少辆汽车。那样就没有记忆浪费。

这些只是我的想法。我很想知道其他答案。

相关问题