Расположение в 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...);

Или что-то типа того. Если вы часто используете объект по значению или вам требуется более точный контроль над памятью, вам следует вместо этого использовать структуры. Если возможно, будет намного проще.

Другие вопросы по тегам