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++ 自定义分配器的主要内容,如果未能解决你的问题,请参考以下文章