我正在为类型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
特征的这种用法。
谢谢, 里斯
答案 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
}