16

Int 的大小为 4 个字节,如果我在我的程序中创建一个新的 Int ,它的内存消耗将增加 4 个字节。正确的?

但是如果我有这门课

public class Dummy{
    private int;
}

我的新班级将使用多少内存?如果它是一个结构,内存消耗会更低吗?我认为引用本身也会消耗一些内存。

4

2 回答 2

16

单个引用在32 位进程上占用 4 个字节,在 64 位进程上占用 8 个字节。引用是类的标准开销(因为它们是引用类型)。结构不会引起引用(好吧,忽略任何潜在的装箱)并且通常是其内容的大小。我不记得课程是否有更多开销,不要这么认为。

这个问题深入研究了类与结构(也在问题评论中提供):

在结构上使用“new”是否会在堆或堆栈上分配它?

如评论中所述,只有类的实例才会消耗此引用开销,并且仅当某处有引用时。当没有引用时,该项目有资格进行 GC - 我不确定没有任何引用的堆上类的大小是多少,我认为它是其内容的大小。

真的,类没有你可以依赖的真正的“大小”。最重要的是,这不应该是使用类或结构的决定因素(但您往往会发现指南指出大约 16 字节或以下的类型可以是合适的结构,而以上倾向于类)。对我来说,决定因素是预期用途。

在谈论结构时,我觉得有必要提供以下链接:为什么可变结构是“邪恶的”?

于 2012-09-13T09:04:57.333 回答
4

一个类是一个引用类型,位于堆中(并将从垃圾收集器中删除)。struct ist 值类型,存储在堆栈中。
在您的示例中,Microsoft 建议使用值类型(结构),因为引用类型会导致过多的开销。

如果您对此主题感兴趣,请查看 Jeffrey Richter 的“CLR via C#”一书。

于 2012-09-13T09:07:47.240 回答