10

newキーワードがクラス コンストラクターを呼び出していることはわかっていますが、どの段階でクラスにメモリを割り当てるのでしょうか?

私の理解では、それはGCHandle.Alloc(Object)メソッドに対応しているはずですが、接続を見つけることができません。

4

2 に答える 2

16

新しい演算子はCLRに実装されています。ガベージコレクションされたヒープからメモリを割り当て、クラスコンストラクタを実行します。

GCHandle.Alloc()は同じではありません。これは、GCの個別のメカニズムを利用して、オブジェクトへの参照、ガベージコレクション中に通常検出されるオブジェクト参照に加えて、別のテーブルに格納されてスキャンされる参照を作成します。Alloc()に既存のオブジェクト参照を渡す必要があります。これにより、別のオブジェクト参照が追加されます。弱い参照と固定参照を作成するのに便利です。また、管理されていないコードが管理対象オブジェクトへの参照を保存し、それを存続させるためのメカニズムを作成するのに役立ちます。C ++/CLIのgcroot<>テンプレートクラスはそれを利用します。

于 2012-07-16T13:33:31.943 に答える
10

newobjオブジェクト作成のためのすべては、オペコード(またはinitobj値型)の背後に隠されています。このように、それは完全に、メモリが割り当てられる方法と場所、およびそれが他のメモリ管理構造にどのように結びつくかについての詳細な実装です。

于 2012-07-16T13:34:01.693 に答える