我在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;
};
答案 0 :(得分:1)
CarPark为空格预分配恒定数量的连续字节。 我至少可以看到两个用例:
1&GT;空间位置:...至少对于汽车的空间(参见注释)如果CarPark将汽车直接放入空间,可能会有以下好处:而不是将您的汽车存储在堆内存中的伪随机位置空间,所有汽车将被紧紧地包装在一起,这意味着迭代所有汽车或释放存储空间将是快速的。这将是缓存友好的。
2 - ;可能的多线程应用程序:根据我的理解,默认分配器对于多程序编程不是很友好(如果我错了,请纠正我。我基于我对C的经验这一点。)分配器必须等待单个内存请求是在接受任何其他请求之前完成,所以如果你想使用多个线程停放某些汽车,那就没有意义了。由于所有分配都是事先完成的,因此多个线程可以停放汽车(当然,您必须实现必要的多线程安全部分),而不是等待分配器完成请求。
3&GT;见评论:
在分配开销很大的情况下,管理固定 本地大小元素可以更有效。 en.wikipedia.org/wiki/Slab_allocation - Rich
在理想情况下,您会知道程序平均(或确切)需要停放多少辆汽车。那样就没有记忆浪费。
这些只是我的想法。我很想知道其他答案。