为何synchronized_pool_resource初始化时会分配内存?
关于std::pmr::synchronized_pool_resource初始化阶段内存分配的解析
问题背景
初始化std::pmr::synchronized_pool_resource时,会向自定义内存资源发起两次内存分配请求(32字节和528字节),需要明确这两次分配的具体用途。
测试代码
#include <iostream> #include <memory_resource> struct A: std::pmr::memory_resource { void *do_allocate(std::size_t bytes, std::size_t alignment) { std::cerr << "alloc: " << bytes << '\n'; return new char[bytes]; } void do_deallocate(void *, std::size_t, std::size_t) {} bool do_is_equal(const std::pmr::memory_resource&) const noexcept { return false; } }; int main() { std::pmr::synchronized_pool_resource{new A{}}; }
编译运行结果
$ g++-14 -std=c++26 -O0 a.cpp -o a $ ./a alloc: 32 alloc: 528
分配用途解析
这两次分配是GCC实现中synchronized_pool_resource内部结构的初始化需求,具体如下:
- 32字节分配:用于承载线程同步相关的元数据。
synchronized_pool_resource是线程安全的池化资源,需要同步机制(如互斥量)保护池的状态,这部分内存用来存储同步控制对象及关联的配置结构体实例。 - 528字节分配:用于初始化池的核心管理结构。池化资源会按不同大小分类维护内存块池,这部分内存用来存储各池的元数据(包括空闲块链表头、块大小记录、分配统计信息等),为后续处理内存分配请求做好准备。
注:不同编译器(如Clang、MSVC)的实现可能存在差异,分配的大小和具体用途可能略有不同,但核心都是为了初始化池资源的内部管理结构与同步机制,保障后续分配操作的高效性。
内容的提问来源于stack exchange,提问作者shynur
相关产品推荐
相关产品推荐

