【问题标题】:How memory management works between bytes and string?字节和字符串之间的内存管理如何工作?
【发布时间】:2015-10-16 09:59:22
【问题描述】:

C# 中,如果我有 4-5 GB 的数据现在以 bytes 的形式出现,那么我将其转换为 string 那么这对内存有什么影响以及如何在对大字符串使用变量时进行更好的内存管理?

代码

 public byte[] ExtractMessage(int start, int end)
    {
        if (end <= start)
            return null;

        byte[] message = new byte[end - start];
        int remaining = Size - end;

        Array.Copy(Frame, start, message, 0, message.Length);

        // Shift any remaining bytes to front of the buffer
        if (remaining > 0)
            Array.Copy(Frame, end, Frame, 0, remaining);

        Size = remaining;
        ScanPosition = 0;

        return message;
    }



   byte[] rawMessage = Buffer.ExtractMessage(messageStart, messageEnd);

   // Once bytes are received, I want to create an xml file which will be used for further more work 

string msg = Encoding.UTF8.GetString(rawMessage);

CreateXMLFile(msg);

 public void CreateXMLFile(string msg)
        {
            string fileName = "msg.xml";
            if (File.Exists(fileName))
            {
                File.Delete(fileName);
            }
            using (File.Create(fileName)) { };

            TextWriter tw = new StreamWriter(fileName, true);
            tw.Write(msg);
            tw.Close();
        }

【问题讨论】:

  • 这里缺少很多的上下文。
  • 我只是想知道字节和字符串之间的内存管理,所以我没有显示任何代码。如果您有知识分享,请不要投反对票
  • 这是您需要的第一个知识点:这取决于语言。
  • @TheParamagneticCroissant:你是否也在对我的其他问题投反对票??????你看起来像一个生病的伙伴。冷静一下:)
  • @IgnacioVazquez-Abrams :谢谢 :) 我已经更新了我的问题中的语言。它的c#

标签: c# memory-management


【解决方案1】:

.NET 字符串存储为 unicode,这意味着每个字符两个字节。由于您使用的是 UTF8,因此在转换为字符串时,内存使用量会增加一倍。

一旦您将文本转换为string,除非您尝试修改它,否则不会再发生任何事情。 string 对象是不可变的,这意味着每次使用 Remove() 等方法之一修改字符串时都会创建一个新的字符串副本。

您可以在这里阅读更多内容:How are strings passed in .NET?

然而,字节数组总是通过引用传递,并且每次更改都会影响所有持有它的变量。因此,更改不会损害性能/内存消耗。

您可以使用var buffer = yourEncoding.GetBytes(yourString); 从字符串中获取byte[]。可以使用静态变量访问常用编码:var buffer= Encoding.UTF8.GetBytes(yourString);

【讨论】:

  • 这是不正确的 - .NET 中的字符串是 Unicode,即每个字符 2 个字节,而原始缓冲区包含 UTF-8 编码文本,从 1 到 4 个字节不等。
  • @PanagiotisKanavos:是的。没有检查他如何存储数组。将更新答案。
猜你喜欢
  • 2013-06-17
  • 2011-10-22
  • 1970-01-01
  • 2021-07-28
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多