我只需编写一些必须具有最佳性能的代码。
要求:
我需要一个非常快速的对象分配器来快速创建对象。我的对象只有3个双打。分配和取消分配将一次只发生一个对象。
我进行了大量研究并提出:
std:vector<MyClass, boost:fast_pool_allocator<MyClass>>
我想知道(在2014-07):
还有其他信息可以回答一些意见:
答案 0 :(得分:1)
搜索memory-pool heaps。基本上,您创建一个专用于单个大小的对象(通常为2,4字节,16字节等的对象)的堆,并从堆中分配对象,该对象可以包含可以适合您的对象的最小大小的块。堆只包含固定大小的块,它很容易管理在其中分配的块,位图可以显示哪些块是空闲的或正在使用,因此插入可以非常快(特别是如果你只是在最后分配和增加一个指针)
作为示例,here's one,您可以采用它并针对特定对象大小和要求明确优化它。
答案 1 :(得分:1)
最接近我所寻求的是Paulo Zemek Code Project文章:O(1) Object Pool in C++。
但我终于分配/保留了size =可能的最大大小*我的对象大小的内存。 因为我没有使用任何需要比我的算法循环更长寿的对象,所以我欺骗说保留的内存空间中的位置是对象。在我的算法循环之后,我刷新了保留的内存空间。在我看来,它是最快的。非常不优雅,但非常快,只需要一次分配和一次释放。
我对答案并不完全满意,这就是我回答自己的原因。我还对每个评论的问题添加了评论,并添加了这个答案以使思考清晰。我知道我的决定/实施并不完全符合这个问题,但我认为应该采取类似的措施。
答案 2 :(得分:0)
我发现这个解决方案对我非常有用:Fast C++11 allocator for STL containers。它在VS2017(~5x)以及GCC(~7x)上略微加速STL容器。此外,您可以手动指定增长大小,或者如果您知道列表中的最大元素数,则可以预先分配它们。