自定义分配器,特别是自定义allocate/deallocate
方法的能力非常有用 - 允许控制某些性能关键区域中使用的低级内存分配策略。 Pooled allocators用于基于节点的容器,fixed-size allocators是一些可以想到的例子。
但是,何时定义自定义construct/destroy
方法很有用?
据我了解,标准规定这些方法与放置new
和显式破坏具有相同的效果,即:
//construct should give the same effect as:
construct (_Type *_ptr, _Type const&_val)
{
new(_ptr) _Type(_val);
}
//destroy should give the same effect as:
destroy (_Type *_ptr)
{
_ptr->~_Type();
}
有没有办法以另一种方式实现这些方法 - 不使用展示位置new
和显式销毁?如果没有,为什么它们是allocator对象的一部分?如果每个人都直接使用展示位置new
和明确销毁,那会不会更容易?
答案 0 :(得分:0)
对于在模板参数周围替换包装器类型的分配器,并对其进行操作,construct
和destroy
应该调用包装器构造函数和析构函数而不是分配的类型。
在C ++ 11中,construct
将任意数量的参数转发给构造函数。自定义分配器可以在列表的开头或结尾插入参数,或者以其他方式拦截和修改参数。但这仅在用户使用就地构造时才有效。
顺便说一句,你绝不应该使用_Type
作为标识符;带有前导下划线后跟大写的标识符将保留用于实现。