申し訳ありませんが、これは私が(動的)配列はDで本当に強力ですが、以下は、しばらくの間、私を悩ませてきたと思うのアレイにD動的配列の初期化、ストライドとインデックス操作
についての3倍の質問になりました:
私は簡単に指定された値で配列を割り当てることができましたが、DIではそうする方法が見つかりませんでした。
int[] a = new int[N];
a[] = a0;
しかし、それはa0
と1が0
で初期化されますので、ライン、非効率的に見える、など2:確かに次は問題ありません。次のような何かが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でそうする方法はありませんか?代わりに、(X)を取得書く方法があるでしょう
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) = ...;
}
}
インデックス演算子を使用した:配列がストライドが戻ってくるようだった、ととしてf
を実装しているかのよう
は、だから私は行ってシミュレートget[x]
?このようにして、strideのget
関数を静的にmixin/includeし、残りの関数を同様に保つことができました。ローカルの構造体が関数のスコープ変数にアクセスすることは許可されていないので、私は取り組んでいるアプローチに興味があります(どうしてですか?)。
読んでいただきありがとうございます。特定の構成ではパフォーマンスがわずかに低下するかもしれませんが(おそらく私はそれらを悪用します)、コードはよりクリーンで包括的です。なぜopIndexとopIndexAssignの違いは、単にopcodeを返すことができないのですか? –
パフォーマンスの問題が解決しました。 C libの配列をポインタからRangeに変換した後、コードはより洗練されたものになった。速度の違いは気づかれませんでした。 –
'void f(Range)(...)'を制約する必要があります。 'isInputRange'? –