Извините, это стало 3-кратным вопросом относительно массивов
Я думаю, что (динамические) массивы действительно эффективны в D, но некоторое время меня беспокоило следующее:
В C++ я мог бы легко выделить массив с назначенными значениями, но в D я не нашел способа сделать это. Наверняка нет проблем:
int[] a = new int[N];
a[] = a0;
Но это выглядит неэффективно, так как первая строка будет инициализирована с 0
, а вторая — с a0
. Можно ли сделать что-то подобное следующему в D?
int[] a = new int(a0)[N]; // illegal
Еще один вопрос эффективности, который у меня есть при использовании шага в std.range:
import std.stdio;
import std.range;
struct S
{
int x;
this(this)
{
writeln("copy ", x);
}
}
void f(S[] s)
{
}
int main()
{
S[] s = new S[10];
foreach (i, ref v; s)
{
v.x = i;
}
f(stride(s, 3)); // error
return 0;
}
Конечно, я был наивен, думая, что могу просто использовать шаг для создания нового массива без копирования его элементов? В D это невозможно сделать, верно?
Итак, я пошел и смоделировал, как если бы массив был таким, как возвращает шаг, и реализовал f
как:
f(s, 3);
void f(S[] s, uint stride)
{
ref S get(uint i)
{
assert (i * stride < s.length);
return s[i * stride];
}
for (uint x ... )
{
get(x) = ...;
}
}
Можно ли вместо этого написать get(x) с помощью оператора индекса get[x]
? Таким образом, я мог бы статически смешать/включить шагающую функцию get
и сохранить остальную часть функции аналогичной. Мне был бы интересен выбранный подход, поскольку локальной структуре не разрешен доступ к переменным области видимости функции (почему бы и нет?).