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

C++ 在分配器中使用自定义构造/销毁方法何时有用?,c++,C++,定制分配器,特别是定制分配/解除分配方法的能力非常有用-允许控制某些性能关键领域中使用的低级内存分配策略。对于基于节点的容器,和是我想到的几个示例 但是什么时候定义自定义构造/销毁方法有用呢 据我所知,标准要求这些方法与放置新和显式销毁具有相同的效果,即: //construct should give the same effect as: construct (_Type *_ptr, _Type const&_val) { new(_ptr) _Ty

定制分配器,特别是定制
分配/解除分配方法的能力非常有用-允许控制某些性能关键领域中使用的低级内存分配策略。对于基于节点的容器,和是我想到的几个示例

但是什么时候定义自定义
构造/销毁
方法有用呢

据我所知,标准要求这些方法与放置
和显式销毁具有相同的效果,即:

//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();
    }

有没有其他方法来实现这些方法-不使用placement
new
和显式销毁?如果不是,为什么它们是分配器对象的一部分?如果每个人都直接使用placement
new
和explicit destruction,不是会更容易吗?

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

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


顺便说一下,您不应该使用
\u Type
作为标识符;带有前导下划线和大写字母的标识符是为实现保留的。

除了放置新的位置外,
construct
函数可能还可以执行其他操作。这是一个定制点,如果你需要的话,最好有它。@Boperson:有没有一个“其他东西”的实际例子?我还没有想到任何东西可以更好地放在实际对象类型本身的
ctor/dtor
中。。。此外,如果
construct/destroy
对普通对象的创建/销毁做了不同的操作,那么在堆栈上创建的本地对象的行为将与通过分配器创建的本地对象的行为不同。这合理吗?这是在分配器中具有此功能的一个原因。当容器存储在共享内存中时,可能需要一些特殊的东西?它允许包含的对象与堆栈对象不同。更多答案如下: