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_chunk,largest_required_pool_block以便实现的平衡尽可能有利于应用程序。
然而,考虑到问题的措辞:
如何避免不必要的内存分配?
如何尽可能减少分配次数?
如果您想尽可能减少上游分配器调用,那么很简单:
largest_required_pool_block您期望分配器面临的最大频繁分配大小。更大的区块意味着更多的分配将有资格进行合并分配。max_blocks_per_chunk大,直到任何给定块大小的并发分配的最大数量。每个块更多的块意味着上游请求之间的分配更多。唯一的限制因素是您愿意为应用程序容忍多少内存占用膨胀。