我用这种方式在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这样的变量。我想在这样的结构中知道我们不使用指针我们应该如何知道内存分配。我们确定这是存储在内存中但没有确切的变量来聚合所有这些并说这个代码分配这个记忆量。 我想知道上面代码中“对一个实例成本的引用有多少内存”
答案 0 :(得分:3)
C#引用没有什么神奇之处,它们与C指针的工作方式大致相同。
您的node
对象包含三个引用 - 因此分配一个新实例将占用堆上3个引用空间。
firstNode
局部变量将占用堆栈上一个引用的大小。
对象引用与指针大小相同,通常在32位CPU上为4个字节,在64位CPU上为8个字节。 .Net CLR上的对象也有8字节开销,因此在32位系统上,node
实例的大小为8 + 3 * 4 = 20字节。
答案 1 :(得分:1)
该类肯定有变量,这三个 node 引用是在对象中占用空间的字段。就存储而言,与 int 类型的字段没有根本区别。它们是运行时的指针,32位模式下各4个字节,64位模式下8个字节。由于您只能担心32位模式下的对象大小,因此该对象将需要8 + 3 * 4 = 20个字节。前8个字节是对象开销,任何对象都有。