标签: c++pmr

unordered_set 可以为节点和存储桶列表使用不同的分配器吗?

我想将 astd::pmr::unordered_map与 a一起使用std::pmr::monotonic_buffer_resource。两者配合得很好,因为集合的节点是稳定的,所以我不会通过重新分配在缓冲区资源中创建很多漏洞:

 std::pmr::monotonic_buffer_resource res;
 std::pmr::unordered_set<T> set(&res);
Run Code Online (Sandbox Code Playgroud)

也就是说,除了桶列表,当集合超过max_load_factor(). 假设我无法reserve()摆脱这种情况,并且我实际上关心自增长以来旧桶列表留下的缓冲区资源中的漏洞,我有什么选择?

如果我知道它unordered_set是作为 实现的std::vector<std::forward_list>,就像在(某些版本的)MSVC 中一样,那么我应该能够使用 ascoped_allocator为vector和forward_list. 但)我不能依赖unordered_set是一个vector<forward_list>可移植的代码和b)scoped_allocator是一个Allocator,而monotonic_buffer_resource是memory_resource,阻抗失配,这将使非常复杂的初始化。

或者我可以根据请求的大小编写一个switch_memory_resource委托给其他memory_resources 的 s 。然后,我可以使用monotonic_buffer_resource与节点大小匹配的请求(但是,我不能,可移植地,知道)以及default_memory_resource()其他所有内容。我可能会做出有根据的猜测,节点最多为sizeof(struct {void* next; size_t hash; T value;}),通过将其乘以 2 来添加一些误差幅度,并将其用作两个memory_resources之间的截止点,但我想知道是否有更简洁的方法?

c++ allocator unordered-set c++17 c++pmr

12
推荐指数
2
解决办法
283
查看次数

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

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

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

例如,看看这个 演示。

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

c++ memory-management c++17 c++pmr

8
推荐指数
1
解决办法
531
查看次数

C++:无法使用 scoped_allocator_adaptor 传播 polymorphic_allocator

我有 avector<vector<int>>并且希望从a 中获取整个内存(即,外部和内部向量的)memory_resource。这是一个精简的示例,首先是无聊的部分:

#include <boost/container/pmr/memory_resource.hpp>
#include <boost/container/scoped_allocator.hpp>
#include <boost/container/pmr/polymorphic_allocator.hpp>
#include <iostream>
#include <string>
#include <vector>

// Sample memory resource that prints debug information
class MemoryResource : public boost::container::pmr::memory_resource {
  void* do_allocate(std::size_t bytes, std::size_t alignment) {
    std::cout << "Allocate " << bytes << " bytes" << std::endl;
    return malloc(bytes);
  }
  void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) { free(p); }
  bool do_is_equal(const memory_resource& other) const noexcept { return true; }
};
Run Code Online (Sandbox Code Playgroud)

这是我感兴趣的部分:

template <typename T>
using Alloc …
Run Code Online (Sandbox Code Playgroud)

c++ boost allocator c++17 c++pmr

6
推荐指数
1
解决办法
733
查看次数

Synchronized_pool_resource 实际上是如何工作的?

我正在研究C++17中的多态内存分配。我修改了一个使用 monotonic_buffer_resource 进行向量分配的示例,以使用synchronous_pool_resource。我发现了一种奇怪的行为。具体来说,有很多内存分配,只是为了向量中的两次加法。我没有运行基准测试,但我认为这对性能造成了巨大的损失

该程序是使用 O2 g++ -std=c++17 -O2 -Wall -pedantic编译的

下面是代码

class debug_resource : public std::pmr::memory_resource {

public:
    explicit debug_resource(std::string name,
        std::pmr::memory_resource* up = std::pmr::get_default_resource())
        : _name{ std::move(name) }, _upstream{ up }
    { }

    void* do_allocate(size_t bytes, size_t alignment) override {
        std::cout << _name << " do_allocate(): " << bytes << '\n';
        void* ret = _upstream->allocate(bytes, alignment);
        return ret;
    }
    void do_deallocate(void* ptr, size_t bytes, size_t alignment) override {
        std::cout << _name << " do_deallocate(): " << bytes << '\n'; …
Run Code Online (Sandbox Code Playgroud)

c++ allocator c++17 c++pmr

4
推荐指数
1
解决办法
2935
查看次数

将 std::allocate_shared 与多态资源分配器一起使用

我正在尝试使用 a 创建共享指针std::pmr::monotonic_buffer_resource,但无法编译它。我缺少什么?

https://godbolt.org/z/R9​​jdju

#include <memory>
#include <memory_resource>

int main() {
    char buffer[100];
    std::pmr::monotonic_buffer_resource mbr(buffer, 100);
    std::shared_ptr<double> sp = std::allocate_shared<double>(mbr);
}
Run Code Online (Sandbox Code Playgroud)
在 /opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/ext/alloc_traits.h:34 包含的文件中,
                 来自/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/stl_uninitialized.h:67,
                 来自/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/memory:66,
                 来自<来源>:1:
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/alloc_traits.h:使用 __alloc_rebind = typename std::__allocator_traits_base::__rebind 替换 'template<class _Alloc, class _Up> <_Alloc, _Up>::type [with _Alloc = std::pmr::monotonic_buffer_resource; _Up = std::_Sp_counted_ptr_inplace<double, std::pmr::monotonic_buffer_resource, __gnu_cxx::_S_atomic>]':
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr_base.h:542:13:需要从 'class std::_Sp_counted_ptr_inplace<double, std::pmr::monotonic_buffer_resource, __gnu_cxx::_S_atomic>'
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr_base.h:679:43:需要来自 'std::__shared_count<_Lp>::__shared_count(_Tp*&, std ::_Sp_alloc_shared_tag<_Alloc>, _Args&& ...) [with _Tp = double; _Alloc = std::pmr::monotonic_buffer_resource; _Args = {}; __gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]'
/opt/compiler-explorer/gcc-10.1.0/include/c++/10.1.0/bits/shared_ptr_base.h:1371:71:需要来自 'std::__shared_ptr<_Tp, _Lp>::__shared_ptr(std:: _Sp_alloc_shared_tag<_Tp>, _Args&& …

c++ shared-ptr allocator c++pmr

2
推荐指数
1
解决办法
1450
查看次数

了解 std::pmr::new_delete_resource

我最近开始研究分配器和 c++17 中引入的新 pmr。

查看 cppreference 上 std::pmr::new_delete_resouce 的定义,我读到以下内容:

返回一个指向使用全局运算符new和运算符delete来分配内存的memory_resource的指针。

这个“全球”让我有点困惑。这是什么意思?它只是指操作员的正常调用吗?

int* i = new int;
delete i;
Run Code Online (Sandbox Code Playgroud)

因此在堆上分配东西,还是指分配全局变量的静态内存?

在这两种情况下使用这种结构有何意义?

c++ c++17 c++pmr

2
推荐指数
1
解决办法
897
查看次数