6

C# では、次のようにかなり客観的な方法で記述するのが一般的です。

MyObj obj = new MyObj();
MyReturn ret = obj.DoSomething();
AnotherReturn rett = ret.DoSomethingElse();

上記を次のように書くだけです。

AnotherReturn rett = new MyObj().DoSomething().DoSomethingElse();

しかし、このような一連の関数呼び出しがある場合、スタックフレームはどのように機能するのでしょうか? この例は非常に簡単ですが、連鎖した関数呼び出しが 50 回以上ある場合を想像してみてください (これは、JavaScript (/w jQuery) などで発生する可能性があります)。

私の仮定では、関数呼び出しごとに戻りアドレスが作成され (「ドット」に?)、戻り値 (他のメソッドを使用した新しいオブジェクト) がその戻りアドレスで次の関数呼び出しにすぐに送り込まれます。これは全体的な戻り値を取得するためにどのように機能しますか (この例では、戻りアドレスは最終的な関数値をrettに割り当てます)? 連鎖呼び出しを続けると、最終的にオーバーフローしますか? その場合、目的のルートを取る方が賢明であると考えられます (「不必要な」メモリ割り当てを犠牲にして?)。

4

2 に答える 2