私は公的および私的な部分が含まれることを望むDモジュールを持っています。私は関数定義の前にキーワードprivateとstaticを使ってみました。私は外部呼び出し可能/公表を望む機能を持っており、理想的にはコールサイトでインライン展開したいと思っています。この関数は、プライベートであることを意図した、すなわち外部呼び出し可能でない他のモジュール内部関数を呼び出します。これらの呼び出しはモジュール内で成功裏にインライン化され、CTFEと既知の定数の伝播によって多くのクレートが処分されます。しかし、GDCコンパイラは、必要に応じてインライン展開され、外部呼び出し可能ではないと想定されていても、これらの内部ルーチンのコピーを生成します。私は-O3-freleaseでコンパイルしています。私は何をしなければなりません - 私が静的および/または私的なものを使用してもこれを期待していますか?D/DLang:モジュールプライベートのインライン関数のコード生成を禁止する
私はまた、この洞察を願ってこのthread concerning GCCを簡単に見ました。
前述のとおり、これらの内部関数でプライベートとスタティックの両方を使用しようとしましたが、コード生成を抑制できないようです。デバッガがブレークポイントを設定するためにこれらのルーチンのコピーを持つ必要があるならば、私はこれを理解することができました。私はこれがリンク時に何らかの形でソートされる可能性があることを強調する必要があります。私はプログラムをリンクしようとしませんでしたが、GDCを使ってMatt Godbolt Dコンパイラエクスプローラで生成されたコードを調べています。テンプレートパラメータの長さがゼロのリスト(例えば、my_fn()(arg_t x))のすべてをテンプレートにすることができ、それを試してみましたが、役に立たないけど害はありません。
他にもいくつか試してみましょう:アダプティブスタイルのパッケージを実装する方法として、私はプライベートパーツで静的クラスを作成してみることができます。 (厳密には単一インスタンスにする必要がある)私はC++を一度もやっていない。大量のasmとCだけを専門に扱っている。それは学習曲線になるでしょう。
私が考えることができる唯一の他のものは、ネストされた関数定義、Pascal/Ada-styleを使用して、内部ルーチンを呼び出し元の本体の内部に移動することです。しかし、これには多くの欠点があります。
ラフの例では、
module junk;
auto my_public_fn() { return my_private_fn(); }
private
static // 'static' and/or 'private', tried both
auto my_private_fn() { xxx ; return whatever; }
現在、GCC固有の拡張asmコードがルーチンに含まれているため、LDCとGDCを比較できませんでした。私は、望ましくない機能体がasm btwを含むものだけではないことに気づいた。 –
あなたは間違いなく '静的'を必要としません。トップレベルの宣言には意味がありません。 – Cauterite
"私はプログラムをリンクしようとしませんでした" - 私はGDCについてあまり知らないうちに、リンク時にデッドコード除去/ COMDATフォールディングが発生してこれらの関数が消滅する可能性があります。おそらく、GDCはこのレベルでDCEを試しても構いません。なぜなら、リンカーはとにかくそれを世話することが期待されるからです。私はちょうどしかし推測している... – Cauterite