2

そのための設計上の理由はありますか(多重継承を放棄した理由など)?

それとも十分に重要ではありませんでしたか?

同じ質問がメソッドのオプションのパラメーターにも当てはまります...これはすでにvb.netの最初のバージョンにありました...したがって、MSがオプションのパラメーターを許可しない原因となる怠惰、おそらくアーキテクチャの決定..そして彼らが持っていたようですC#4にはそれが含まれるので、それについての心変わり..

決定が何であり、なぜそれをあきらめたのか誰か知っていますか?

編集:

たぶん、あなたは私を完全に理解していませんでした。私は最近、計算プログラム (最後の桁まで、あらゆるサイズの数値をサポートする) に取り組んでいます。このプログラムでは、1 秒あたり文字通り何百万回も使用されるメソッドがあります。

Add(int num) というメソッドがあり、このメソッドはパラメータ ( Add(1);) として 1 を使用して静かに使用されているとします。特に 1 つのメソッドに対して特別なメソッドを実装する方が高速であることがわかりました。numそして、オーバーロードを意味するのではありません- AddOne と呼ばれる新しいメソッドを作成し、その中に Add メソッドを文字通りコピーし1ます。これはひどく奇妙に思えるかもしれませんが、実際にはより高速です。

(醜い限り)

ここで驚くほど役立つ手動インラインを C# がサポートしていないのはなぜかと思いました。

ありがとう。(そして、なぜあなたは私に反対票を投じたのですか:S)

編集2:

これを追加するかどうかを自問しました。私は、そのようなプロジェクトに dot net などのプラットフォームを選択することの奇妙さ (および欠点) をよく知っていますが、dot net の最適化はあなたが思っているよりも重要だと思います... 特に Any CPU などの機能.

4

7 に答える 7

6

質問の一部に答えるには、Eric Gunnersonのブログ投稿を参照してください:C#に「インライン」キーワードがないのはなぜですか?

彼の投稿からの引用:

C#の場合、インライン化はJITレベルで行われ、JITは通常適切な決定を行います。

編集:オプションのパラメーターのサポートが遅れた理由はわかりませんが、他の言語が提供するものに対する私たちの期待に基づいて実装することが期待されているように聞こえます。優先順位のリストではそれほど高くなく、バージョンごとに特定の機能を公開する期限があったと思います。特にメソッドのオーバーロードが利用可能な代替手段であったため、これまではおそらく重要性が増していませんでした。一方、ジェネリックス(2.0)、およびLINQを可能にする機能など(3.0)を入手しました。私は言語の進歩に満足しています。前述の機能は、オプションのパラメーターのサポートを早期に取得するよりも重要です。

于 2009-10-25T18:29:37.677 に答える
3

手動のインライン化はほとんど役に立ちません。JITコンパイラーは、必要に応じてネイティブコードのコンパイル中にメソッドをインライン化します。ほとんどの場合、JITコンパイラーは、プログラマーよりも適切なタイミングを推測するのに優れていると思います。

オプションのパラメータについては、以前のバージョンになかった理由がわかりません。とはいえ、C#4に存在するのは好きではありません。パラメーターが消費アセンブリに焼き付けられ、DLLの標準値を変更して消費が必要な場合は再コンパイルする必要があるため、多少有害であると考えています。新しいものを使用するためのアセンブリ。

編集:

インライン化に関するいくつかの追加情報。JITコンパイラにメソッド呼び出しをインライン化させることはできませんが、メソッド呼び出しをインライン化しないように強制することはできます。このためには、次のようにSystem.Runtime.CompilerServices.MethodImplAttributeを使用します。

internal static class MyClass
{
    [System.Runtime.CompilerServices.MethodImplAttribute(MethodImplOptions.NoInlining)]
    private static void MyMethod()
    {
        //Powerful, magical code
    }

    //Other code
}
于 2009-10-25T18:25:25.190 に答える
1

私は最近、計算プログラム (最後の桁まで、任意のサイズの数値をサポートする) に取り組んでいます。このプログラムでは、1 秒あたり文字通り何百万回も使用されるメソッドがあります。

次に、間違った言語を選択しました。私は、あなたが実際にコードをプロファイリングし (そうですか?)、マイクロ最適化以外に役立つものがないことを知っていると思います。また、高性能のネイティブ bigint ライブラリを使用していて、独自のライブラリを作成していませんよね?

その場合は、.NET を使用しないでください。部分的な特殊化で速度を上げることができると思われる場合は、Haskell、C、Fortran、またはそれを自動的に実行するか、インライン化を公開して手動で実行できる他の言語に移動してください。

本当に重要な場合Add(1)は、ヒープ割り当ても重要です。

ただし、プロファイラーが何を教えてくれるかを実際に確認する必要があります...

于 2009-10-26T01:06:10.673 に答える
1

私の経験に基づいた推測: C# の以前のバージョンに省略可能なパラメーターがなかった理由は、C++ でのそれらの不適切な経験のためです。表面的には、それらは十分に簡単に見えますが、厄介なコーナー ケースがいくつかあります。Herb Sutter の本の 1 つに、これについて詳しく説明されていると思います。一般に、メソッドのオーバーライドに関係していますvirtualMaximilianは、回答の中で .NET コーナー ケースの 1 つに言及しています。

また、複数のオーバーロードを手動で作成することで、それらを使用しなくてもほとんど問題を解決できます。クラスの作成者にとってはあまり良いことではないかもしれませんが、クライアントはオーバーロードとオプションのパラメーターの違いにほとんど気付かないでしょう。

では、何年にもわたってそれらがなかったのに、なぜ C# 4.0 でそれらが追加されたのでしょうか? 1) VB.NET との同等性が向上し、2) COM との相互運用が容易になりました。

于 2009-10-25T18:35:16.070 に答える
0

C#は4.0でそれらを追加しました:http://msdn.microsoft.com/en-us/library/dd264739 (VS.100).aspx

最初から行われなかった理由については、メソッドのオーバーロードによって柔軟性が向上したと感じたことが原因である可能性があります。オーバーロードを使用すると、使用している他のパラメーターに基づいて複数の「デフォルト」を指定できます。また、それほど多くの構文ではありません。

于 2009-10-25T18:25:24.330 に答える
0

C ++のような言語でも、何かをインライン化しても、それが発生することは保証されません。これはコンパイラへのヒントです。 コンパイラーは、ヒントを受け取るか、独自のことを行うことができます

C#は、生成されたアセンブリコードから(IL + JITを介して)削除されるもう1つのステップであるため、何かがインライン化されることを保証することはさらに困難になります。さらに、動作が異なるJITのx86+x64実装などの問題があります。

于 2009-10-25T18:32:44.347 に答える
0

Java にはinlineキーワードも含まれていません。Java JIT が優れているほど、仮想メソッドでさえインライン化できます。privateやfinalなどキーワードを使用しても違いはありません (以前はそうでしたが、それは今では古い歴史です)。

于 2009-10-25T19:56:22.540 に答える