std::pmr同步池分配器如何复用单调缓冲资源的内存?
// allocate chunks of memory (starting with 10k) without deallocating: std::pmr::monotonic_buffer_resource monotonic{10'000}; for (int j=0; j < 100; ++j) { std::pmr::synchronized_pool_resource pool{&monotonic}; std::pmr::vector<std::pmr::string> coll{&pool}; for (int i=0; i < 100; ++i) { coll.emplace_back("123"); } }
每次循环迭代中,pool是否应该复用monotonic分配器的内存?有资料指出这是可行的,但同步池资源是如何实现的?
我主要疑惑的是,单调资源本质上是“不可复用”的——除非被销毁,否则不会释放内存,这种情况下复用是如何实现的?
编辑补充:
我发现之前的理解有误。根据相关实验,必须将synchronized_pool_resource置于循环外,关键在于vector的析构函数:
std::pmr::monotonic_buffer_resource monotonic{1'024}; std::pmr::synchronized_pool_resource pool{&monotonic}; for (int j=0; j < 3; ++j) { std::pmr::vector<std::pmr::string> coll{&pool}; coll.emplace_back("123"); std::cout << "Allocated at: " << coll.data() << "\n"; }
输出结果:
Allocated at: 0x18e0680 Allocated at: 0x18e0680 Allocated at: 0x18e0680
这等效于调用pool.deallocate(ptr, N);,如相关回答所述。
内容的提问来源于stack exchange,提问作者Lorah Attkins
相关产品推荐
相关产品推荐

