C++ 自定义分配器

Posted

技术标签:

【中文标题】C++ 自定义分配器【英文标题】:C++ custom allocator 【发布时间】:2014-12-15 15:18:27 【问题描述】:

您好,我在一些资源的帮助下编写了一个自定义分配器。它适用于 std::vector, list 。然而对于 std::unordered_map 构造函数被调用两次。我不是为什么。有人可以帮我理解正在发生的静态初始化吗?这是代码

文件:helper.h

template<typename T>
class helper

 static const size_t init_size = 12; // 0xF4240 max number of entries in the data structure
public:
      helper() :
      alloc_size(
      sizeof(link) > sizeof(T) ?
      init_size * sizeof(link) : init_size * sizeof(T)), offset(
      sizeof(link) > sizeof(T) ? sizeof(link) : sizeof(T))
  
       std::cout <<"Initial allocation done" << " I value : " << i << std::endl;
   


;

文件:main.cpp

int main()

    std::unordered_map<long,long,hash<long>, equal_to<long> , myallocator<pair<const long,long> > >            my_map;

以这种方式调用它会使 helper 构造函数在程序中被调用两次。向量不会发生这种情况。关于模板初始化,我有什么不明白的地方吗?请帮忙

【问题讨论】:

--1: “建设者”?哪一个?请发布***.com/help/mcve——一个实际编译的。请准确地包括您期望的输出和您得到的输出。您是否阅读过“如何提问”帮助页面?他们应该引导你完成它。 感谢您的建议。我已经做出了改变。 【参考方案1】:

容器不仅可以为您提供的类型创建分配器,还可以通过rebind 为不同的类型创建分配器。这显然是您的情况。你没有提供足够的代码让别人编译检查,但是你可以在helper的构造函数中添加这个:

std::cout << __PRETTY_FUNCTION__ << std::endl;

这适用于 GCC 和 Clang,并将显示函数/类被实例化的模板参数。

【讨论】:

感谢您的建议。我尝试将其放入辅助构造函数中,然后得到以下内容。它用 T = std::__detail::_Hash_node_base* 调用,然后用 T = std::__detail::_Hash_node<:pair long unsigned int> 调用。为什么这样做?谢谢

以上是关于C++ 自定义分配器的主要内容,如果未能解决你的问题,请参考以下文章

自定义堆栈分配器中的 C++ 内存对齐

自定义内存池(C++需要掌握)

带有自定义删除器和分配器的 shared_ptr

尝试将自定义 C++ 矩阵传递给 numpy 数组

我们如何使用 '=' 运算符为 C++ 中的自定义数据类型赋值?

(C++)自定义链表并写入