有谁知道创建引用类型变量时占用了多少内存?
字符串 s = "123";
's' 作为引用(而不是指向它的数据)会占用多少内存?
这可以按以下方式细分:
String s = "123";
变量s:
这将消耗当前架构上的本机指针大小(如果操作系统是 32 位或进程在 WoW64 下执行,则被视为 32 位),因此相应地为 32 位或 64 位。在这种情况下,s要么在堆栈上,要么已注册。如果您将字符串引用放入数组中,那么该空间将在堆上被消耗。
字符串是一个对象这一事实:
8 个字节的开销分为 4 个字节用于方法表,它兼作对象实际类型的指示,加上 4 个字节用于一些内务处理位和允许其用作锁定语句目标的同步块。
该字符串始终以空字符结尾(尽管这是一个实现细节,不是运行时合同的一部分),以便它可以直接与 C 样式字符串 api 一起使用,字符为 UTF-16,因此每个字符两个字节.Net 使用字符的意义(原因的细节很复杂并且需要转入 Unicode,我将省略)。
字符串还包含以下内容:
4.0 之前的 .Net 版本
- 字符串长度(以字符为单位)的 int
- 一个 int 表示保存字符的基础数组的长度
- 字符串中第一个字符(后续字符直接在其后面)或空字符串的空字符
字符串may由于 StringBuilder 的工作方式,消耗的内存量是实际保存所需字符数组所需内存量的两倍
因此,字符串本身将在堆上消耗 16 + (2*n) + 2 和 16 + (4*n) + 2 个字节,具体取决于它的创建方式。
.Net 4.0 及以上版本
- 字符串长度(以字符为单位)的 int
- 字符串中第一个字符(后续字符直接在其后面)或空字符串的空字符
字符串本身将在堆上至少消耗 12 + (2*n) + 2 个字节。
请注意,在这两种情况下,字符串占用的实际空间可能略多于其使用的空间,具体取决于运行时强制执行的对齐方式,这可能不超过 IntPtr.Size。
这可能会因字符串驻留而变得更加复杂(其中两个单独的实例最终指向同一个字符串,因为它是不可变的),因为理论上您应该将堆开销(加上驻留开销)除以对字符串的“独立”引用的数量细绳。
有关此问题的更多讨论,请查看本文。但请注意,本文对于 4.0 中的更改已经过时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)