2013-09-16 6 views
3

Есть ли у D что-то похожее на C++ 11's emplace_back()? Обычно я хочу это, когда я добавляю одну или несколько структур в конец массива или какой-либо другой контейнер D со значениями семантики для своих членов?Смещение в D

Update: Я думаю, это правильный ответ ?: http://dlang.org/phobos/std_conv.html#.emplace

Я все еще думаю, что его отношение к вопросу о необходимости устанавливать в отношении того, что D имеет более строгий контроль над памятью - Может ли необходимость устанавливать быть сделанный obselete через умную оптимизацию компилятора, в случае, упомянутом выше?

ответ

3

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...); 

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

+0

Возможно, может возникнуть необходимость в стандартной библиотечной функции 'emplaceBack()'? –

+0

Итак, если я правильно прочитаю; 'emplace' позволяет обойти ограничение, что классы имеют только ссылочную семантику? –

+0

Если есть какие-либо риски для его использования? –