gpt4 book ai didi

c#引用变量内存分配

转载 作者:太空狗 更新时间:2023-10-29 22:03:30 26 4
gpt4 key购买 nike

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

字符串 s = "123";

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

最佳答案

按以下方式分割:

String s = "123";

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

字符串是一个对象的事实:8 个字节的开销拆分为方法表的 4 个字节,它兼作对象实际类型的指示加上 4 个字节用于一些内务管理位和允许它用作锁定语句目标的同步块(synchronized block)。

字符串总是以空字符结尾(尽管这是一个实现细节,不是运行时契约的一部分),因此它可以直接与 C-Style 字符串 api 一起使用,字符是 UTF-16 所以两个字节每个字符在某种意义上 .Net 使用字符(为什么很复杂并且需要转入 Unicode 的细节我将省略)。

字符串还包含以下内容:

.Net 4.0 之前的版本

  • 一个 int 表示字符串的字符长度
  • 一个 int,表示包含字符的底层数组的长度
  • 一个字符,它是字符串中的第一个字符(后续字符直接在它之后)或空字符串的空字符

由于 StringBuilder 的工作方式,字符串可能消耗的内存量是实际保存字符数组所需内存量的两倍

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

4.0 以上的 .Net 版本

  • 一个 int 表示字符串的字符长度
  • 一个字符,它是字符串中的第一个字符(后续字符直接在它之后)或空字符串的空字符

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


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

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

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

关于c#引用变量内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/489805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com