2

C# では、スタックからポップすると、スタックからオブジェクトが削除され、オブジェクトが返されます。

ただし、C++ ではhttp://blogs.msdn.com/b/zhanli/archive/2010/06/29/c-tips-why-the-pop-method-of-stl-stack-does-not- return-a-value.aspxの場合、pop 関数はオブジェクトを返しません。

C++ にできないことを C# にできる理由は何ですか? それとも、この例外ケースが発生するかどうかを C# が気にしないようなものですか? 「operator= またはコピー コンストラクターが例外をスローした場合、問題が発生します。スタックの内部状態は変更されていますが、ポップされた要素を取得していません。」(リンクより)

4

2 に答える 2

5

C++ ではコレクション内の項目のコピーを返しますが、C# では参照を返します。参照を返すと、例外がスローされないことが保証されます。

于 2013-10-25T04:31:16.403 に答える
3

C# では、操作が「安価」であるため、構造体またはオブジェクト参照のバイト単位のコピーを返すだけです。

C++ では、オブジェクトを返すのはコストがかかります。コピー コンストラクターを呼び出してオブジェクト自体のコピーを作成する必要があります。これには、新しいリソースの割り当てや古いリソースの破棄など (ただし、これらに限定されません)、ユーザーが指定したすべての操作が含まれる可能性があります。もの。

(たとえば、返されるオブジェクトが二分木である場合を想像してください。コピーは、たとえば an のコピーに比べて非常にintコストがかかります。)

C++11 では、オブジェクトのコピーを回避するために「移動セマンティクス」を使用できましたが、移動セマンティクスは pop_backに導入され、わざわざ変更することはありませんでした。

于 2013-10-25T04:31:24.773 に答える