Я реализую операцию клонирования с выделением ресурсов для массива типа 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
.
Спасибо, Рис