【问题标题】:Allocate memory to variable in c# [duplicate]在c#中为变量分配内存[重复]
【发布时间】:2017-09-11 14:52:52
【问题描述】:

我有以下几行代码:

SomeClass a;
SomeClass b = new SomeClass();
SomeClass c = new SomeClass()
{
    Foo="sss",
    Bar="dddd"
};

类实例abc 的大小(在内存中)是多少?

每个变量分配了多少内存?

【问题讨论】:

  • 实际变量都是相同大小的,因为它们是引用。并且堆中的实际对象也将具有相同的大小(请注意,字符串将是该对象具有引用两个的单独对象)。当然a 并没有实际引用任何内容,因为它是nullstackoverflow.com/questions/3800882/…
  • 堆上的内容和堆栈上的内容实际上是框架的实现细节。字符串实习也是如此。并且 JiT 编译可能会消失,因为它从未被使用过并且是死代码。所以:可能的最大和最小数量之间的任何东西,取决于运行它的运行时。更大的问题是:你为什么要问?你走的是哪一种微优化或错误的道路?

标签: c# memory memory-management size


【解决方案1】:

当你实例化b和c时,内存是自动分配的,你不必自己处理。你可以忘记那部分,那是托管的魔法部分,一旦不再需要这些对象(没有指向它的指针......),垃圾收集器就会为你释放内存空间。尽管如此, b 和 c 占用相同的内存大小,因为它是相同的类型。 a 尚未初始化,因此不占用空间。

【讨论】:

  • a 确实在堆栈中为实际变量占用空间,它只是不引用堆中的任何内容。
  • c# 编译器和 JIT 通常会删除未使用的变量,删除它们,从而不分配内存对吗?
  • 这只是一个代码 sn-p 所以可能有一个 if 后者确实设置了 a 在这种情况下它不能被优化掉,但是它可能会像 @987654324 一样编译@ 甚至都不在那里。
  • 但是 if 语句也可能是死代码,因为 a 从未设置。编译器/JiT 编译器足够聪明,可以捕捉到这些。特别是如果 'a' 是私有的并且它不是部分类的一部分。
猜你喜欢
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 2011-06-23
  • 1970-01-01
相关资源
最近更新 更多