是否有一个C ++分配器尊重被覆盖的新/删除?

时间:2011-10-19 14:32:15

标签: c++ allocator new-operator

我正在为类型T的数组实现资源分配克隆操作。简单的实现使用new T[sz],然后从源到新数组的std::copy调用。它走了两次记忆。

我想分配原始内存,然后使用std::uninitialized_copy,因此出于性能原因,我只会使用一次内存。我知道如何在使用自定义分配器(Allocator.allocate后跟std::uninitialized_copy)时完成此操作,并且我知道如何使用std::allocator(在::operator new之后使用lib.allocator.members来完成此操作{1}}在规范的第20.4.1.1节中)。我担心的是,基于std::allocator的方法对于已定义T的类型T::operator new似乎有误。我知道我可以使用Boost.TypeTraits'has_new_operator来检测这种情况。

是否有一种简单的,符合标准的方式来分配并初始化原始内存,以一种尊重被覆盖的新方式(并且只通过内存一次)?如果没有,使用SFINAE在使用std::allocator的实现和使用重写的运算符new之间进行调度似乎是合理的吗? FWIW,通过Boost进行点击并没有显示has_new_operator特征的这种用法。

谢谢, 里斯

2 个答案:

答案 0 :(得分:4)

似乎不可能。只有operator new[]知道如何以特定于实现的方式存储数组大小(如果T具有析构函数)(operator delete[]然后使用此信息)。因此,没有可移植的方法来存储这些信息而没有新的表达式(并且没有调用元素构造函数)。

答案 1 :(得分:1)

尝试放置新的。

    typedef std::string T;
    T src[5];
    char* p = new char[sizeof(T)* 5];
    T* dest = (T*)p;
    for(int i = 0;i < 5; ++i)
    {       
        new(dest + i) T(src[i]); //placement new
    }