当前位置:  开发笔记 > 编程语言 > 正文

c#引用变量mem分配

如何解决《c#引用变量mem分配》经验,为你挑选了2个好方法。

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

String s ="123";

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



1> ShuggyCoUk..:

这按以下方式分解:

String s = "123";

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

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

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

字符串还包含以下内容:

.Net之前的.Net版本

字符串长度的int

一个int,表示保存字符的基础数组的长度

字符串是字符串中的第一个字符(后续字符直接在其后面)或空字符串的空字符

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

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

.Net的版本从4.0开始

字符串长度的int

字符串是字符串中的第一个字符(后续字符直接在其后面)或空字符串的空字符

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


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

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

有关这方面的更多讨论,请参阅本文.但请注意,本文对4.0中的更改已过时.



2> Stu Mackella..:

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

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有