默认pmr分配器和默认std分配器性能差异的原因



我正试图调查两个分配器之间性能差异的原因,如https://en.cppreference.com/w/cpp/memory/monotonic_buffer_resource.到目前为止我发现了什么:

根据编译器资源管理器的说法,在GCC中,默认的pmr分配器似乎使用monotonic_buffer_resource,而不是std分配器
  • 我查看了头文件和libstdc++的源代码,但找不到如何monotonic_buffer_resource已选择由默认pmr分配器使用
  • 从我对源代码的阅读来看,似乎应该使用std::pmr::new_delete_resource(),这应该使默认的std分配器和默认的pmr分配器相同,但显然不是
  • void default_pmr_alloc() {
    std::pmr::list<int> list; // uses monotonic_buffer_resource
    for (int i{}; i != total_nodes; ++i) {
    list.push_back(i);
    }
    }
    void default_std_alloc() {
    std::list<int> list; // uses operator new/delete
    for (int i{}; i != total_nodes; ++i) {
    list.push_back(i);
    }
    }
    

    它确实使用了new_delete_resource。(来自std::pmr::get_default_resource()(


    您可以通过进行检查

    list.get_allocator().resource()->is_equal(*std::pmr::new_delete_resource()); // true
    

    https://godbolt.org/z/qGTG57MfY


    不确定基准是什么,但类型擦除会有自己的惩罚,pmr可能会更慢。

    最新更新