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;

我的问题是这段代码分配了多少内存?如您所见,没有任何变量,例如整数或双精度数。我想知道在这样的结构中我们不使用指针我们应该如何知道内存分配。我们确定这是存储在内存中但没有确切的变量来聚合所有这些并说这段代码分配这个内存量。我想知道上面代码中的“引用实例需要多少内存”

4

2 回答 2

3

C# 引用没有什么神奇之处,它们的工作方式与 C 指针大致相同。

您的node对象由三个引用组成 - 因此分配一个新实例将占用堆上 3 个引用的空间。

局部变量将firstNode占用堆栈上一个引用的大小。

对象引用与指针大小相同,在 32 位 CPU 上通常为 4 个字节,在 64 位 CPU 上为 8 个字节。.Net CLR 上的对象也有 8 字节的开销,因此在 32 位系统上,node实例的大小为 8+3*4 = 20 字节。

于 2013-09-26T12:28:18.627 回答
1

该类当然有变量,这三个节点引用是在对象中占用空间的字段。就存储而言,与int类型的字段没有根本不同。它们是运行时的指针,在 32 位模式下每个 4 个字节,在 64 位模式下每个 8 个字节。由于您只能担心 32 位模式下的对象大小,因此该对象将占用 8 + 3 * 4 = 20 个字节。前 8 个字节是对象开销,任何对象都有。

于 2013-09-26T12:29:10.390 回答