【发布时间】:2011-03-13 08:52:53
【问题描述】:
最近我发现了 Boos Pool 库并开始将其改编为我的代码。库提到它缺少的一件事是一个基类,它将覆盖任何类的新/删除运算符并使用池进行内存管理。我编写了自己的实现并通过一些元模板编程,它实际上看起来非常不错(通过简单地从基类派生来支持大小在 1 到 1024 字节之间的任何类)
我提到这些事情是因为到目前为止这真的很酷也很令人兴奋,然后我发现了这个post from Boost mailing list。似乎有些人真的对 Pool 库进行了抨击,特别指出了他们所说的在 O(n) 时间内运行的 free() 方法的效率低下。我单步执行了代码,发现这是该方法的实现:
void free(void * const chunk)
{
nextof(chunk) = first;
first = chunk;
}
对我来说,这看起来像 O(1),我真的没有看到他们在谈论的低效率。我确实注意到的一件事是,如果您使用多个 singleton_pool 实例(即不同的标签和/或分配大小),它们都共享相同的互斥锁(更准确地说是关键部分),这可以进行一些优化。但如果您使用常规堆操作,它们将使用相同形式的同步。
那么其他人是否认为池库效率低下且过时?
【问题讨论】:
-
nextof(void*)的实现是什么?
-
像往常一样,拥有一个或多个互斥体是一种权衡。如果您有 很多 个池,您会得到一种内存碎片,因为它们会将自己的内存留给自己。
-
@Null nextof(...) 是一个单行 reinterpret_cast
标签: c++ optimization memory-management boost malloc