【问题标题】:Memory usage in .NET when creating a new class or struct创建新类或结构时 .NET 中的内存使用情况
【发布时间】:2012-09-06 08:03:42
【问题描述】:

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

但如果我有这门课

public class Dummy{
    private int;
}

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

【问题讨论】:

  • int 是 4 个字节,32 个。引用在 32 位系统上占用 4 个字节,在 64 位系统上占用 8 个字节。引用是类的标准开销(因为它们是引用类型),结构不会引起引用并且通常是其内容的大小。我不记得类是否有更多开销,不这么认为。
  • @AdamHouldsworth,你的第一条评论应该是一个答案
  • 没有人能比 Jon Skeet 更好地解释类与结构的将军:stackoverflow.com/questions/203695/…
  • 类本身不消耗内存,只有类的实例会消耗内存。

标签: c# .net memory


【解决方案1】:

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

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

Does using "new" on a struct allocate it on the heap or stack?

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

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

说到结构,我觉得有义务提供以下链接:Why are mutable structs “evil”?

【讨论】:

  • 一小点:决定字节数的是进程,而不是系统。 x64 机器上的 x86 进程将使用 4 个字节,而不是 8 个字节,对吗?
  • @Sugrue 不确定,CLR 也在这里起作用……如果我没记错的话,有一个 32 位和 64 位 CLR。我会稍微改写一下。
【解决方案2】:

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

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

【讨论】:

  • 我认为这过于简化了。 Eric Lippert's blog 涵盖了这一点,简短的版本是值类型并不总是在堆栈中。
猜你喜欢
  • 2020-09-13
  • 2020-11-27
  • 1970-01-01
  • 2011-02-27
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
相关资源
最近更新 更多