1)scope
パラメータ格納クラスは、パラメータへの参照をエスケープできないことを意味します。例:
Object glob;
struct S
{
Object o;
void foo(scope Object o)
{
this.o = o; // Not allowed! 'o' must not be escaped
glob = o; // ditto
}
}
DMDはこれを検出するのにあまりよくないことに注意してください。上記の例は現在コンパイルされていますが、許可されていません。
scope
は、デリゲートのパラメータのために最も有用である:上記の例で
void foo(scope void delegate() dg)
{
/* use dg */
}
void main()
{
int i;
foo({ ++i; });
}
ことがある(foo
「保証」するので、何の閉鎖は、それが上位値を持っているにもかかわらず、匿名関数のために割り当てる必要がありませんコンパイラの仕事...)は、デリゲートがエスケープされていないことを示します。 DMDは現在、この最適化を実装しています。
2)考えているのは、const
とscope
の両方を使用すると、理論的にコンパイラがリファレンスまたは値を渡すことができるということです。そのため、in
ショートカットが便利です。 DMDはこれを今は利用していませんが、それにもかかわらず便利なショートカットです。
簡潔に言えば、in
は、現在、代理人で使用されていない限り、パフォーマンスを得ることはできません。 ref
は、大きな構造体または静的配列でパフォーマンスを向上させます。パフォーマンス上の理由からref
を使用すると、const
は、ref
がではなく、が元の値を更新するために使用されていることを文書化(および実施)することがよくあります。
1.私は効果を再現できなかった理由を説明します。 2.関数のパラメータが 'in'ストレージクラスを持っていれば、それはコピーされると言っていますか? 'const ref'を使うべきですか? – Arlen
現在のコンパイラ選択では、すべてDMDに基づいてコピーされます。しかし、それについての素敵なことは、ユーザーが違いを知ることができないため、技術的に定義された実装であるということです。 DMDが最適化のためにこれを利用するには、まず 'scope'を完全に実装する必要があります。コピーをボトルネックとして特定し、最適化したい場合は、 'const ref'を使うのは良い考えです。 –
DMDについてどう知っていますか?あなたはコア開発者の一人ですか? – Arlen