Расположение в D
Есть ли в D что-то похожее на C++11? emplace_back()
? Обычно я хочу этого, когда добавляю одну или несколько структур в конец массива или некоторого другого контейнера D с семантикой значений на его членах?
Обновление: я думаю, что это правильный ответ?: http://dlang.org/phobos/std_conv.html
Я все еще думаю, что уместно поставить вопрос о необходимости emplace в отношении того факта, что D обладает более строгим контролем над памятью. Может ли необходимость в emplace быть устаревшей благодаря умной оптимизации компилятора, в случае, упомянутом выше?
1 ответ
Для emplace в D требуется, чтобы память уже была установлена заранее, и в первую очередь она предназначена для размещения классов в стеке или в памяти, управляемой вручную (встроенная новая всегда использует кучу gc, если вы не взломали время выполнения).
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...);
Или что-то типа того. Если вы часто используете объект по значению или вам требуется более точный контроль над памятью, вам следует вместо этого использовать структуры. Если возможно, будет намного проще.