c#引用变量内存分配

时间:2009-01-28 22:56:33

标签: c# memory variables reference

有没有人知道在创建引用类型变量时占用了多少内存?

String s =“123”;

将有多少内存用作参考,而不是指向它的数据?

5 个答案:

答案 0 :(得分:12)

以下列方式细分:

String s = "123";

变量s: 这将消耗当前架构上的本机指针大小(如果操作系统是32位,或者进程在WoW64下执行,则被视为32位),因此相应地为32位或64位。在这种情况下,s要么在堆栈上,要么已经注册。如果您将字符串引用放入数组中,那么该空间将在堆上使用。

字符串是一个对象: 8个字节的开销分割4个字节用于方法表,它可以指示对象的实际类型加上一些内务比特的4个字节以及允许它用作锁定语句目标的同步块。

字符串总是由空字符终止(虽然这是一个实现细节,不是运行时契约的一部分),所以它可以直接用于C-Style字符串apis,字符是UTF-16所以两个字节在某种意义上,每个字符.Net使用字符(为什么复杂的细节,需要一个segue到Unicode我将省略)。

字符串还包含以下内容:

4.0之前的.Net版本

  • 字符串长度为int的字符
  • 一个int,表示包含字符
  • 的基础数组的长度
  • 一个字符,它是字符串中的第一个字符(后面的字符就在它之后)或空字符串的空字符

字符串可能消耗最多两倍于实际保存StringBuilder工作所需的字符数组所需的内存量

因此,字符串本身将在堆上消耗16 +(2 * n)+ 2到16 +(4 * n)+ 2个字节,具体取决于它的创建方式。

.Net从4.0开始的版本

  • 字符串长度为int的字符
  • 一个字符,它是字符串中的第一个字符(后面的字符就在它之后)或空字符串的空字符

字符串本身将在堆上消耗至少12 +(2 * n)+ 2个字节。


请注意,在这两种情况下,字符串可能占用的空间略多于它使用的空间,具体取决于运行时强制执行的对齐方式,这可能不会超过IntPtr.Size。

这可能会因字符串实习而变得更加复杂(其中两个单独的实例最终指向同一个字符串,因为它是不可变的),因为理论上你应该将堆开销(加上内部开销)除以'独立'的数量对字符串的引用。

有关此问题的更多讨论,请查看this article。但请注意,本文对4.0中的更改已过时。

答案 1 :(得分:10)

引用本身的大小取决于您的处理器体系结构 - 32位为4个字节,64位为8个字节。

答案 2 :(得分:4)

根据您使用的是32位还是64位计算机,它可能是32位或64位指针。

答案 3 :(得分:1)

需要参考的典型4个字节

答案 4 :(得分:1)

如果您想在代码中查看此内容,请致电:

IntPtr.Size