12

コードの最適化を有効に して、リリースモードで実行可能ファイルをコンパイルする場合、コンパイラは、パフォーマンスを向上させるために、特定の基準を満たす関数をインライン化することを選択する場合があります。

私の質問は次のとおりです。インライン化された関数の本体で例外がスローされた場合、インライン展開に関係なくスタックトレース情報は保持されますか? つまり、元の関数をエラーの原因として表示するのか、それとも呼び出し元の関数を表示するのか?

4

2 に答える 2

13

例外がどのようにスローされたかによって異なります。throwステートメントを使用する場合、問題はありません。ジッターは、throw を含むメソッドをインライン化しません。プロパティセッターを高速にする必要がある場合に注意する必要があります。

ただし、NullReferenceException や IndexOutOfRangeException などの通常の実行によって例外が発生した場合は、インライン化されていればスタック トレースにメソッドの名前は表示されません。これは少し当惑するかもしれませんが、通常は、呼び出し元のメソッドのソース コードと例外の種類から理解できます。うまくいけば、それは比較的小さいです。この[MethodImpl(MethodImplOptions.NoInlining)]属性は、インライン化を抑制するために使用できます。それが役に立つとわかったときには、通常は手遅れです ;)

于 2013-06-21T00:58:53.380 に答える