C++ 用于相同大小的小对象的非常快速的对象分配器

C++ 用于相同大小的小对象的非常快速的对象分配器,c++,arrays,performance,boost,stl,C++,Arrays,Performance,Boost,Stl,我只需要编写一些必须具有最佳性能的代码 要求: 我需要一个非常快速的对象分配器来快速创建对象。我的物体只有3个双倍。分配和解除分配一次只发生一个对象 我做了很多研究,得出了以下结论: std:vector<MyClass, boost:fast_pool_allocator<MyClass>> std:vector 我想知道(2014-07年): stl是否具有与boost::boost:fast\u pool\u分配器等效的功能 对于我发现的问题,有更好的解决方案

我只需要编写一些必须具有最佳性能的代码

要求:

我需要一个非常快速的对象分配器来快速创建对象。我的物体只有3个双倍。分配和解除分配一次只发生一个对象

我做了很多研究,得出了以下结论:

std:vector<MyClass, boost:fast_pool_allocator<MyClass>>
std:vector
我想知道(2014-07年):

  • stl是否具有与boost::boost:fast\u pool\u分配器等效的功能
  • 对于我发现的问题,有更好的解决方案吗
还有其他信息可以回答一些评论:

  • 代码将用于优化我的算法,用于:
  • 我需要将C代码转换成C或C++来提高性能。我应该和另一个用纯“C”编写的算法竞争。我刚刚发现我的文章中的比较图表有错误,因为我针对用C for x86 Debug编译的代码进行了测试。在x64版本中,“C”代码要快得多(比x86调试快4到5倍)
  • 根据这一点,boost:fast_pool_分配器似乎是用于逐个查询相同大小的小内存块的最佳分配器。但我想确保没有其他更标准(stl的一部分)或更快的东西存在
  • 我的代码将在Visual Studio 2013上开发,并针对任何windows平台(无手机或平板电脑)
  • 我的目的不是拥有快速的代码,而是拥有最快的代码。如果可能的话,我宁愿不要有太多扭曲的代码,也要寻找可维护的代码(至少是最低限度的)
  • 如果可能,我还想知道使用std:vector vs array(即:[])的影响
  • 有关更多信息,请参见
搜索。基本上,您可以为单个大小的对象(通常为2、4字节、16字节等的幂)创建一个专用堆,并从堆中分配可以包含适合您的对象的最小大小的块的对象。由于每个堆只包含固定大小的块,因此很容易管理在其中分配的块,位图可以显示哪些块是空闲的或正在使用的,因此插入可以非常快(特别是如果您只是在末尾分配并递增一个指针)


例如,您可以根据特定的对象大小和要求对其进行明确的优化。

最接近我所要查找的内容是Paulo Zemek代码项目文章:

但我最终还是分配/保留了大小=最大可能大小*我的对象大小的内存。 因为我没有使用任何比我的算法循环寿命更长的对象,所以我作弊说保留内存空间中的位置是对象。在我的算法循环之后,我刷新了保留的内存空间。在我看来这是最快的。非常不优雅,但速度非常快,只需要一次分配和一次释放


我对答案并不完全满意,这就是为什么我自己回答。我还为每一条评论的问题添加了一条评论,并添加了这个答案,以明确我的想法。我知道我的决定/实施与问题不完全一致,但我认为应该进行类似的操作。

我发现这个解决方案对我非常有用:。它略微加快了VS2017(~5x)和GCC(~7x)上的STL容器的速度。此外,您可以手动指定增长大小,或者如果您知道列表中元素的最大数量,则可以预先分配所有元素。

您是否首先配置了
std::vector
?您如何知道一种结构是否比其他结构更适合?情况如何?背景?不,我没有描述。我还没有给我的项目增加动力。我问是因为我不知道该选什么?满足我的需要最快的方法是什么?我不明白。我的问题还不清楚,我在C++中没有10年的程序,我发现的唯一的想法就是我在这里所呈现的。如果stl现在有一个好的分配器,那就告诉我。我真的很高兴听你这么说。STL是你的编译器自带的。不同的编译器有不同的实现。通常,默认的分配器是可以使用的。没有所谓的“纸上最快的”,因为“最快的”取决于太多的变量——您到底是如何使用数据结构的?在什么编译器上?在什么操作系统上?从用户的角度来看,性能的差异是否重要?这就是为什么评测很有价值——因为它可以准确地告诉您瓶颈在哪里。另一种选择是假设,而关于瓶颈位置的假设通常是错误的。构建一些有效的东西,然后看看它是否足够快。我将从普通的std::vectorA开始位图太复杂了,只需在这些自由对象的内存中维护一个自由对象的链接列表。要释放一个对象,只需调整两个指针,要分配一个,只需修改一个指针。唯一需要处理的特殊情况是一个空的自由对象列表。没错,这只是在我打字时突然出现在我脑海中的东西,可能有助于OP满足他的特殊需求。如果超高速是他的目标,那么位图的缓存本地化可能会有一些帮助。不过,ta对于常见情况肯定会产生误导。@cmaster位图在什么方面过于复杂?@NickStrupat,因为它不支持您需要的操作。管理空闲块的数据结构必须恰好支持两种操作,而那些具有最佳性能的操作:1)添加一个空闲块,2)检索一个空闲块(如果有空闲块),任何空闲块都可以。位图完全支持第一个操作,但第二个操作失败:要检索空闲块,必须搜索位图。这是一种太复杂的操作方式,不可能太快。链表方法完美地支持这两种操作。