c#参考变量mem分配

c#参考变量mem分配,c#,memory,variables,reference,C#,Memory,Variables,Reference,有人知道创建引用类型变量时占用了多少内存吗 字符串s=“123” “s”将占用多少内存作为引用,而不是指向它的数据?取决于您是在32位还是64位机器上,它将是32位还是64位指针。需要调用4个字节作为引用。引用本身的大小将取决于处理器体系结构-32位上有4个字节,64位8字节。如果要在代码中检查此项,请调用: IntPtr.Size 这可以按以下方式分解: String s = "123"; 变量s: 这将消耗当前体系结构上的本机指针大小(如果操作系统为32位或进程在WoW64下执行,则视为

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

字符串s=“123”


“s”将占用多少内存作为引用,而不是指向它的数据?

取决于您是在32位还是64位机器上,它将是32位还是64位指针。

需要调用4个字节作为引用。

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

如果要在代码中检查此项,请调用:

IntPtr.Size

这可以按以下方式分解:

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

字符串是对象这一事实: 8字节的开销拆分为方法表的4个字节,该方法表兼作对象实际类型的指示,加上一些内务管理位的4个字节,以及允许将其用作lock语句目标的syncblock

字符串总是以空字符结尾(尽管这是一个实现细节,不是运行时契约的一部分),因此可以直接与C风格的字符串API一起使用,字符是UTF-16,因此每个字符有两个字节.Net使用字符(原因的细节很复杂,需要转换成Unicode,我将省略)

字符串还包含以下内容:

4.0之前的.Net版本
  • 字符串长度的整数(以字符为单位)
  • 表示包含字符的基础数组长度的int
  • 字符串中的第一个字符(后面紧跟其后的字符)或空字符串的空字符
由于StringBuilder的工作方式,字符串可能会消耗两倍于实际保存字符数组所需的内存量

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

从4.0开始的.Net版本
  • 字符串长度的整数(以字符为单位)
  • 字符串中的第一个字符(后面紧跟其后的字符)或空字符串的空字符
字符串本身将在堆上消耗至少12+(2*n)+2个字节


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

字符串插入可能会使这一点更加复杂(两个单独的实例最终指向同一个字符串,因为它是不可变的),因为理论上应该将堆开销(加上插入开销)除以字符串的“独立”引用数


有关这方面的更多讨论,请看。但是,请注意,这篇文章对于4.0中的更改已经过时。

否。为什么?如何以更少浪费的方式引用内存中的对象?Anthony he是对的。在32位机器上,指针是32位的。而在64位机器上,指针是64位的。您可能对转换感到困惑从一位到一个字节。+1,或者更恰当的答案:一个微不足道的重要空间量你有关于这个的文档参考吗?不是权威性的,但是试试。一个.Net引用在内部只是指向托管堆上的一个对象的指针。ECMA-335(公共语言基础设施):12.1支持的数据类型。它们存储在一个等于指针大小的本机大小的整数中。请注意,这取决于所有处理器体系结构、操作系统位数以及可执行文件是否表示支持在64位模式下运行。作为引用,“s”会占用多少内存,而不是指向它的数据?是否你的意思是“s”作为引用而不是指向的对象会占用多少内存?