是否存在一个尊重重写的new/delete的C++分配器

Is there a C++ allocator that respects an overridden new/delete?

本文关键字:new 重写 delete 分配器 C++ 存在 一个 是否      更新时间:2023-10-16

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

我想分配原始内存,然后使用std::uninitialized_copy,所以出于性能原因,我只遍历内存一次。我知道当使用自定义分配器(Allocator.allocate后面跟着std::uninitialized_copy(时如何实现这一点,并且我知道如何使用std::allocator(在规范的第20.4.1.1节中,它使用了lib.allocator.members后面的::operator new(来实现这一目标。我担心的是,对于定义了T::operator new的类型T,基于std::allocator的方法似乎是错误的。我知道我可以使用Boost.TypeTraits的has_new_operator来检测这种情况。

是否有一种简单的、符合标准的方法来分配原始内存,然后以尊重重写的新内存的方式初始化原始内存(并且只传递一次内存(?如果不是,那么使用SFINAE在使用std::allocator的实现和使用重写运算符new的实现之间进行调度是否合理?FWIW,通过Boost的grepping并没有显示出对has_new_operator特性的这种使用。

谢谢,Rhys

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

然后尝试放置new。

    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
    }