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

C++17 PMR:: Set number of blocks and their size in a unsynchronized_pool_resource

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

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

例如看看这个demo

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

池化分配器在 memory wasteupstream allocator calls 之间进行权衡。减少一个几乎总是会增加另一个,反之亦然。

最重要的是,使用它们的主要原因之一(至少根据我的经验)是在内存受限的情况下限制或彻底消除长 运行 进程的内存碎片。因此,可以假设“在问题上投入更多内存”往往会适得其反。

因此,这里没有通用的一刀切规则。什么是更可取的总是取决于您的应用程序的需要。

找出 max_blocks_per_chunklargest_required_pool_block 的正确值最好基于全面的内存使用分析,以便实现的平衡尽可能有利于应用程序。

但是,鉴于问题的措辞:

How to avoid unnecessary memory allocations?

How to reduce the number of allocation that take place as much as possible?

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

  • 使largest_required_pool_block成为您期望分配器面对的最大频繁分配大小。更大的块意味着更多的分配将符合合并分配的条件。
  • 使 max_blocks_per_chunk 尽可能大,达到任何给定块大小的最大并发分配数。每个块更多的块意味着上游请求之间的更多分配。

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