C++17 PMR:: 设置 unsynchronized_pool_resource 中的块数量及其大小

get*_*ubl 8 c++ memory-management c++17 c++pmr

是否有任何规则可以以最有效的方式设置 unsynchronized_pool_resource 中块中的块数 (max_blocks_per_chunk) 和最大所需块 (largest_required_pool_block)?

如何避免不必要的内存分配?

例如,看看这个 演示

如何尽可能减少分配次数?

小智 6

池化分配器的功能需要memory waste权衡upstream allocator calls。减少一个几乎总是会增加另一个,反之亦然。

最重要的是,使用它们的主要原因之一(至少根据我的经验)是限制或彻底消除内存受限场景中长时间运行的进程的内存碎片。因此,人们认为“在问题上投入更多内存”往往会适得其反。

因此,这里不存在放之四海而皆准的通用规则。更可取的总是由您的应用程序的需求决定。

最好基于彻底的内存使用分析来计算 和 的正确值max_blocks_per_chunklargest_required_pool_block以便实现的平衡尽可能有利于应用程序。

然而,考虑到问题的措辞:

如何避免不必要的内存分配?

如何尽可能减少分配次数?

如果您想尽可能减少上游分配器调用,那么很简单:

  • 设定largest_required_pool_block您期望分配器面临的最大频繁分配大小。更大的区块意味着更多的分配将有资格进行合并分配。
  • 尽可能max_blocks_per_chunk大,直到任何给定块大小的并发分配的最大数量。每个块更多的块意味着上游请求之间的分配更多。

唯一的限制因素是您愿意为应用程序容忍多少内存占用膨胀。