0

私はこのようにC#でツリーのようなものを実装しました:

public class node {
    public node parent = null;
    public node leftChild = null;     
    public node rightChild = null;
}

今、私が以下に書くコードのどこかに

node firstNode = new node();
firstNode.rightChild = new node();
firstNode.rightChild.parent = firstNode;

私の質問は、このコードが割り当てるメモリの量ですか? ご覧のとおり、integer や double などの変数はありません。ポインターを使用しないこのような構造で知りたいメモリ割り当てについてどのように知る必要があるか.これはメモリに格納されていると確信していますが、それらすべてを集約してこのコードが割り当てると言う正確な変数はありませんこの量のメモリ。上記のコードで「インスタンスへの参照にかかるメモリの量」を知りたい

4

2 に答える 2

3

C# の参照には魔法はなく、C のポインターとほとんど同じように機能します。

オブジェクトnodeは 3 つの参照で構成されているため、新しいインスタンスを割り当てると、ヒープ上で 3 つの参照に相当するスペースが必要になります。

firstNodeローカル変数は、スタック上の 1 つの参照のサイズを占めます。

オブジェクト参照はポインターと同じサイズで、通常、32 ビット CPU では 4 バイト、64 ビット CPU では 8 バイトです。.Net CLR のオブジェクトにも 8 バイトのオーバーヘッドがあるため、32 ビット システムでは、nodeインスタンスのサイズは 8+3*4 = 20 バイトになります。

于 2013-09-26T12:28:18.627 に答える
1

クラスには確かに変数があります。これら 3 つのノード参照は、オブジェクト内のスペースを取るフィールドです。ストレージに関する限り、int型のフィールドと基本的に違いはありません。これらは実行時のポインタで、32 ビット モードではそれぞれ 4 バイト、64 ビット モードでは 8 バイトです。32 ビット モードではオブジェクトのサイズしか心配できないため、オブジェクトは 8 + 3 * 4 = 20 バイトになります。最初の 8 バイトはオブジェクトのオーバーヘッドで、どのオブジェクトにもあります。

于 2013-09-26T12:29:10.390 に答える