为什么我的.NET字符串在内存中这么大?

时间:2019-05-31 15:17:31

标签: c# performance memory memory-management stream

如果我运行

string myString = "*.txt";
Print("sizeof(char): " + sizeof(char) + " bytes");
Print("myString.Length * sizeof(char): " + (myString.Length * sizeof(char)) + " bytes");

它将打印

  

sizeof(char):2个字节

     

myString.Length * sizeof(char):10个字节

但是,如果我从第一个答案到this question运行代码:

myString = "*.txt"
long size = 0;
using (Stream s = new MemoryStream())
{
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(s, myString);
    size = s.Length;
}
Print("myString Serialized Size: " + size + " bytes");

我明白了

  

myString序列化大小:29个字节

其中哪一个更准确地表示了我的字符串在内存中占用了多少空间?

1 个答案:

答案 0 :(得分:3)

询问字符串的大小(字节)很复杂;

  • 内部将使用UTF-16,因此:字符数增加了一倍(假设创建的字符不会过大,则可能
    • 但是string对象本身具有字符串长度要考虑的对象开销,因此存在“填充”等
  • 如果您要谈论原始二进制编码的大小,那么您需要知道您正在讨论的Encoding; ASCII,UTF-8,UTF-16等- plus ,您需要知道是否包含BOM表
  • 您不会 要做的一件事就是通过BinaryFormatter运行它; BinaryFormatter是通用串行器,其中包括类型元数据,字段名称等;通常,您应该几乎从不BinaryFormatter ...用于任何事情:)

所以:您得到意外的答案的原因是您提出了错误的问题。对于“记忆中”的讨论,您实际上是在追求第一个项目符号。给出确切答案并不容易,因为对象开销的大小取决于您的目标平台。