D'emplace требует, чтобы память уже была установлена раньше времени и предназначена прежде всего для размещения классов в стеке или управляемой вручную памяти (встроенный новый всегда использует кучу gc, если вы не взломаете druntime).
emplace_back также прилагается. Чтобы получить то, что он делает, сначала добавьте элемент, а затем замените его. Но так как классы D - это всегда ссылки, это не работает без особой осторожности.
Если вы добавляете структуры в массив, это будет работать на месте, и я не уверен, что он копирует или нет. Компилятор может, конечно, оптимизировать, что расстояние:
struct A {}
A[] arr;
arr ~= A(); // this puts the new one at the end of the array, and might optimize away the copy
прилагая класс на месте в массив будет сложнее. Вы хотели бы сделать что-то в одиночку эти строки:
ubyte[] arr;
C[] references;
arr.length = arr.length + __traits(classInstanceSize, C);
references ~= emplace!(C)(arr[$ - __traits(classInstanceSize, C) .. $], ctor args...);
Или что-то в этом роде. Если вы используете объект по стоимости много, или вам нужен более точный контроль над памятью, вы должны посмотреть на использование структур вместо этого. Если это возможно, это будет намного проще.
Возможно, может возникнуть необходимость в стандартной библиотечной функции 'emplaceBack()'? –
Итак, если я правильно прочитаю; 'emplace' позволяет обойти ограничение, что классы имеют только ссылочную семантику? –
Если есть какие-либо риски для его использования? –