Есть ли в C++ аллокатор, который уважает переопределенные new/delete?

Я реализую операцию клонирования с выделением ресурсов для массива типа T. Прямая реализация использует new T[sz] с последующим вызовом std::copy из источника в новый массив. Это дважды обращается к памяти.

Я хотел бы выделить необработанную память, а затем использовать std::uninitialized_copy, так что для повышения производительности я обращаюсь к памяти только один раз. Я знаю, как этого добиться, когда используется пользовательский аллокатор (Allocator. allocate с последующим std::uninitialized_copy), и я знаю, как этого добиться с помощью std::allocator (который использует ::operator new после lib.allocator.members в разделе 20.4.1.1 спецификации). Меня беспокоит то, что подход, основанный на std::allocator-е, кажется неправильным для типов T, где определен T::operator new. Я знаю, что могу определить такую ситуацию, используя Boost.TypeTraits' has_new_operator.

Существует ли простой, соответствующий стандартам способ выделения и последующей инициализации необработанной памяти таким образом, который будет уважать переопределенный new (и при этом передавать память только один раз)? Если нет, то кажется ли разумным использование SFINAE для диспетчеризации между реализацией, использующей std::allocator и реализацией, использующей переопределенный оператор new? FWIW, поиск по Boost не показывает такого использования признака has_new_operator.

Спасибо, Рис

11
задан Rhys Ulerich 22 November 2011 в 19:19
поделиться