2010-12-13 4 views
2

DLLを介したC++コンパイラのインラインメソッド呼び出しが可能ですか? .NET JITは可能ですか?DLL間でC++コンパイラのインラインメソッド呼び出しを行うことは可能ですか?

+1

C++の場合:確かにいいえ。あなたが持っていないものをどうやってインライン化できますか? – ruslik

+0

@ruslik:機能を「所有」するためのソースコードは必要ありません。インラインにするオブジェクトファイルのどの部分がコンパイラによってファイルに格納されているかを知るだけで済みます。 –

+0

@ Jorgen:どちらかがDLLにあるので、残りのコードとは独立して更新できます。明示的にインライン化するか、それ以上DLLにはなりません。 – ruslik

答えて

4

これは、.NETジッタの場合は確かです。これは単にDLLからILをロードするだけで、ジャストインタイムコード生成はDLLから来たという事実をなくします。 DLLのすべてのコードは同じローダーヒープに入ります。これの1つの結果は、AppDomain全体がアンロードされない限り、DLLをアンロードできないことです。

C++コンパイラでは明確なNoです。エクスポートされた関数はプリコンパイルされ、DLLベースのアドレスからオフセットされた固定アドレスに配置されます。最適化は可能ですが、IATを介した間接的なジャンプが必要です。しかし、インラインではなく、コンパイラによって行われなければなりません。

+0

偉大な答え、ありがとう! – Ostap

+0

JITが可能です。 .NETがそうしているかどうかは分かりません。 .NETはEXEとDLL用にコンパイルされたマシンコードをキャッシュし、実行ごとにカスタマイズされたバージョンを再コンパイルするとそのキャッシュは役に立たなくなります。 –

1

「.net」タグが含まれていない場合は、答えはです。です。しかし、 ".net"タグを使用すると、インラインに最適化することができます。DLLがP/Invokeに対してネイティブコードDLLでない限り、ジッタは少なくともになります。

1

C++ヘッダーファイルで完全に定義された関数は、関数に割り当てられたコンパイル単位がないため、通常の状況下ではコンパイラーによってインライン化されなければなりません。もちろん、関数のエントリポイントが見つからないので、関数はDLLに属していないと言うこともできますが、これはニッピッカーの視点に過ぎません。

0

コンパイラのフラグ/GL (Whole Program Optimization)をチェックしてください。

このフラグは、関数のインライン展開を含む、モジュールの境界を越えて最適化するようリンカに指示します。

+1

ちょっとわかりました。つまり、/ GLはクロスDLL呼び出しではなく、1つはネイティブです。 –

+0

これは、コードを体系化するのに役立ちます。それがなければ、ほとんどの関数をヘッダーに入れるか、あるいは大規模な.cppファイルに入れなければならないでしょう(ほとんどのインライン展開に役立ちます)。 – ruslik

関連する問題