Почему мои строки .NET такие большие в памяти? - PullRequest
0 голосов
/ 31 мая 2019

Если я запускаю

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байт

Но , если я запускаю код из первого ответа на этот вопрос :

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 Ответ

3 голосов
/ 31 мая 2019

Запрос о размере (байтах) строки является сложным;

  • внутренне, это будет UTF-16, поэтому: вдвое больше символов (при условии, что он не был создан слишком большого размера, что возможно )
    • , но сам объект string имеет длину строки и служебные данные, которые нужно учитывать, затем есть "padding" и т. Д.
  • если вы говорите о размере в ванильных двоичных кодировках, то вам нужно знать, что Encoding вы обсуждаете; ASCII, UTF-8, UTF-16 и т. Д. - плюс вам необходимо знать, включаете ли вы спецификацию
  • единственное, что вы бы не сделали - это пропустили BinaryFormatter; BinaryFormatter - сериализатор общего назначения, включающий метаданные типа, имена полей и т. Д .; в общем, вы должны почти никогда использовать BinaryFormatter ... для чего угодно :)

Итак: причина, по которой вы получаете неожиданный ответ, в том, что вы задаете неправильный вопрос. Для обсуждения "в памяти", вы действительно после первой пули. Нелегко дать точный ответ, потому что размер служебных данных зависит от вашей целевой платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...