何时在分配器中使用自定义构造/销毁方法很有用?

时间:2012-03-18 04:30:09

标签: c++

自定义分配器,特别是自定义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和明确销毁,那会不会更容易?

1 个答案:

答案 0 :(得分:0)

对于在模板参数周围替换包装器类型的分配器,并对其进行操作,constructdestroy应该调用包装器构造函数和析构函数而不是分配的类型。

在C ++ 11中,construct将任意数量的参数转发给构造函数。自定义分配器可以在列表的开头或结尾插入参数,或者以其他方式拦截和修改参数。但这仅在用户使用就地构造时才有效。

顺便说一句,你绝不应该使用_Type作为标识符;带有前导下划线后跟大写的标识符将保留用于实现。