Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串分配-Visual studio内存探查器不';没有道理_C#_String_Memory_Allocation - Fatal编程技术网

C# 字符串分配-Visual studio内存探查器不';没有道理

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

Visual studio内存分析器对我来说没有意义,我正在查看双字符串数组[101000] 并试图找出内存是如何分配给它的

  • “e96”字符串如何占用20个字节?它不应该是:长度成员(int的大小)+字符串长度*字符大小吗?在这个例子中,4+3*2=10字节
  • 我的计算是基于字符串问题和Majid答案的大小

  • 下面的快照已排序,因此数组中的最小字符串大小为20字节,总大小如何=40KB?它应该大于10000*20
  • 我错过了什么

    代码可以找到


    首先回答你的第二个问题:

    请尝试在此行之前拍摄快照:

    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)