【问题标题】:How much does c# allocate memory in the tree which there are not any variables?c# 在没有任何变量的树中分配多少内存?
【发布时间】:2013-09-26 12:06:55
【问题描述】:

我以这种方式在 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;

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

【问题讨论】:

  • 这不是有效的 C# 代码。
  • 这在语法上几乎不正确
  • 你总是在运行时为变量分配内存,即使它只是你的平台基础。最重要的是,类定义会消耗内存。一个类的实例会消耗内存。如果您要具体询问对实例的引用需要多少内存(如上面的示例所示),您可以改写您的问题。
  • 您正在查看每个引用的平台WORD 大小和对象的通常开销.. 例如带有类型对象指针(使用 vtable 等)的标头,同步块索引.. 真的不过..这有什么关系?

标签: c# data-structures tree


【解决方案1】:

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

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

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

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

【讨论】:

  • 引用在堆栈上。它们指向堆上的数据。语义是的...... :) 编辑:我刚刚意识到你在你的答案中进一步澄清了这一点。我的错!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多