const
(およびin
)
C関数があると考えてください:
unsigned int foo(const unsigned int a);
const
コードが でコンパイルに合格するかのように、生成されたコードには影響しconst
ません。そうでない場合は何も壊れないconst
ため、C コンパイラはコンパイル時にコード コントラクト指定子としてのみ使用します。
uint foo(in uint a);
Dでこの関数を書いたりuint foo(const uint a);
呼び出したりする努力はありますか? これは、D コンパイラが を呼び出すためのより効率的なコードを生成するのに役立ちfoo
ますか? それとも (少なくとも値型の引数に対して) 効果がありませんか?
ref
とout
C関数あり
unsigned int bar(unsigned int *a);
uint bar(uint* a);
これを D に変換するときにポインター構文を使用する義務がありますか、それともuint bar(ref uint a);
(またはuint bar(out uint a);
、それが出力専用であることがわかっている場合a
は、のドキュメントからbar
) 書くことができますか? ref
との下に追加の隠れた機構がありout
ますか、それとも見た目のように単純なポインタにすぎませんか? out
呼び出しが D のスコープ外に出た場合、D はパラメーターをデフォルト値に初期化するための「グルー コード」を生成しますか?
Update1:ref
s とs が引数でどのように処理されるかをテストするための簡単なコードを書きました。out
実際には、少なくともint
s の場合は単純なポインターのように見えますがout
、渡されたときに初期値にリセットされません。C 側はその値を読み取って変更できます。のように効果的に機能しref
ます。このように使用するときに GC 関連の問題が発生する可能性があるかどうかはわかりません。
Update2:ref
関数の結果でポインターの代わりに使用することも期待どおりに機能します。const
はまだテストされておらず、プログラムを逆アセンブルせずにチェックする方法がわかりません。