C# 字符串分配-Visual studio内存探查器不';没有道理
Visual studio内存分析器对我来说没有意义,我正在查看双字符串数组[101000] 并试图找出内存是如何分配给它的C# 字符串分配-Visual studio内存探查器不';没有道理,c#,string,memory,allocation,C#,String,Memory,Allocation,Visual studio内存分析器对我来说没有意义,我正在查看双字符串数组[101000] 并试图找出内存是如何分配给它的 “e96”字符串如何占用20个字节?它不应该是:长度成员(int的大小)+字符串长度*字符大小吗?在这个例子中,4+3*2=10字节 我的计算是基于字符串问题和Majid答案的大小 下面的快照已排序,因此数组中的最小字符串大小为20字节,总大小如何=40KB?它应该大于10000*20 我错过了什么 代码可以找到 首先回答你的第二个问题: 请尝试在此行之前拍摄快照: s
首先回答你的第二个问题: 请尝试在此行之前拍摄快照:
string[,] mat = GetData();
Console.WriteLine("Please take a snapshot here!");
Console.ReadLine()
object cellObjectList = GetCells(mat);
您正在拍摄可能正在优化mat[,]的快照。请在此时拍摄的快照中查看阵列的包含大小
要回答您的第一个问题:
通过调试并查看字符串[,]内存
第一个字符串(e96)指向此地址:
a0 6e c1 02 (0x02c1e6a0)
通过检查这个地址,我们可以看到这20个字节
84 d4 ad 70 03 00 00 00 65 00 39 00 36 00 00 00 00 00 00 00
前四个字节和最后零个字节没有意义
在转储文件中!第一个字符串元素0x028923f0上的DumpObject显示:
0:000> !do 028923f0
Name: System.String
MethodTable: 70add484
EEClass: 706b4a50
Size: 20(0x14) bytes
File: C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
String: e96
Fields:
MT Field Offset Type VT Attr Value Name
70adf2d8 4000273 4 System.Int32 1 instance 3 m_stringLength
70addecc 4000274 8 System.Char 1 instance 65 m_firstChar
70add484 4000278 50 System.String 0 shared static Empty
>> Domain:Value 00c33988:NotInit <<
我们有20个字节
84 d4 ad 70 03 00 00 00 65 00 39 00 36 00 00 00 00 00 00 00
希望这能有所帮助。你对1的解释很奇怪(我觉得20差不多是对的)。。。在发布之前,你有没有检查过关于这个主题的文章?提供这样的链接将有助于了解您的想法来自何方。同时显示产生该结果的代码将有助于。。。(我假设您已经看到类似的内容)数组中的字符串可能指向内部字符串(您是否通过分配“e96”来设置数组的所有元素)?不,数组由具有不同长度的随机字符串填充字符是一个类,因此类中有头信息。该类还包含一个私有属性,用于指示字符是一个字节还是两个字节。@jdweng C#char是一个结构,总是两个字节显然,我没有考虑对象头的开销。谢谢
// e96
00 00 00 80 => SyncBlock for String type
84 d4 ad 70 => Method Table of String class
03 00 00 00 => Number of characters in string (string length = 3)
65 00 => e
39 00 => 9
36 00 => 6
00 00 => Padding it to the nearest 4 bytes, 16 here (excluding sync block)