4

今、私は自分が書いたものではない古いコードを分析します。ヘッダーには、次のような多くの宣言があります。

SVPDSDKDLLEXPORT inline C3vec mult(C3vec src, D3DXMATRIX &m);

SVPDSDKで使用される場合、SVPDSDKDLLEXPORTは_declspec(dllexport)として定義されます。SVPDSDK.dllを使用するプロジェクトで使用される場合は、_declspec(dllimport)として。ヘッダーに定義がなく、.cppファイルにあるため、ここでのインライン化は非常に奇妙に思えますが、SVPDSDKとそれぞれのDLLを使用するすべてのプロジェクトのコンパイルとリンクは問題なく実行されます。無視され、インライン化されていないかのように関数がエクスポートされると思います。

私はこの議論を見つけました: C ++:dllimport / dllexportを使用したインライン関数?

そのようなすべての宣言から「インライン」を削除する必要があるように見えました。インライン化とエクスポート/インポートを混在させないでください。しかし、MSDNでこのトピックを見つけました:http: //msdn.microsoft.com/en-us/library/xa0d9ste

私はそれのいくつかの部分を理解していません。

dllexport属性を使用して関数をインラインとして定義できます。この場合、プログラム内のモジュールが関数を参照しているかどうかに関係なく、関数は常にインスタンス化されてエクスポートされます。この関数は、別のプログラムによってインポートされたものと見なされます。

まず、「関数は常にインスタンス化される」とはどういう意味ですか?C ++でのテンプレート関数のインスタンス化に関するトピックのみが見つかり、他のインスタンス化は見つかりませんでした。テンプレートとのみ接続されていますか?

次に、「関数は常にエクスポートされます」。全くわかりません。declspec(_dllexport)を使用した関数がエクスポートされない場合がありますか?どのような場合ですか?

インポートについて:

dllimport属性で宣言された関数をインラインとして定義することもできます。この場合、関数は拡張できますが(/ Ob仕様に従う)、インスタンス化されることはありません。特に、インラインインポートされた関数のアドレスが取得されると、DLLに存在する関数のアドレスが返されます。この動作は、インラインでインポートされていない関数のアドレスを取得するのと同じです。

繰り返しますが、この場合のインスタンス化の意味はわかりません。

この質問を書き、MSDNのトピックを分析しているときに、エクスポート/インポートと同時にインライン化される関数は、プロジェクト自体(私の場合はSVPDSDK)でのみインライン化され、すべてでインライン化されないという結論に達しました。プロジェクトのインポート。これは、MSDNトピックで明らかに宣言されていません。それを使用するプロジェクトにインポートせず、ヘッダーファイルに定義がない場合、通常のインライン関数になるため、リンケージエラーが発生します。それから、インライン化とエクスポート/インポートを混合することは、上記のスタックオーバーフローの議論の答えと矛盾すると考えて、同意できるように思えます。私は正しいですか?
そして、インライン関数のインスタンス化に関するこのすべての言葉をまだ理解していません。

申し訳ありませんが、いくつかの質問を1つのトピックにまとめましたが、同じ問題と同じ資料で統合されているため、どのように別々の質問に分割するかはわかりません。しかし、誰かが私のためにこの質問を明確にすることができれば、私は感謝します。

4

1 に答える 1

6

実際、これinlineはオプティマイザの一種のヒントです。コンパイラは、bodyを使用して実際の関数を生成したり、スタックに引数をプッシュしたりすることができます。これにより、ロジックが破損することはありません。「インライン」関数に10000行を超えるコードがある場合は、間違いなくそうなります。Microsoftには特別な__forceinlineキーワードさえあります。それが導入された理由を推測します。

The function is always instantiated and exported ...

ここでは言葉遣いが完璧ではないかもしれません。インスタンス化とは、ここでボディとエントリポイントが生成されることを意味します。これは、テンプレートのインスタンス化とは何の関係もありません。段落全体は、それが。__declspecよりも重要であることを意味しinlineます。

彼らは基本的に、インライン展開がまだ可能である間、現在のバイナリモジュールでこのインライン関数の本体の生成を防ぐようdllimportに書いています。dllimport

于 2012-08-13T02:20:14.023 に答える