Сколько байтов займет строка? - PullRequest
27 голосов
/ 19 октября 2010

Может кто-нибудь сказать, сколько байтов займет приведенная ниже строка?

string abc = "a";

Ответы [ 3 ]

35 голосов
/ 19 октября 2010

Из моей статьи о строках :

В текущей реализации, по крайней мере, строки занимают 20+ (n / 2) * 4 байта (округляя значение n / 2 вниз), где n - количество символов в строке. Тип строки необычен тем, что размер самого объекта варьируется. Единственные другие классы, которые делают это (насколько я знаю), это массивы. По сути, строка - это массив символов в памяти, плюс длина массива и длина строки (в символах). Длина массива не всегда совпадает с длиной в символах, поскольку строки могут быть «перераспределены» в mscorlib.dll, чтобы упростить их создание. (Например, StringBuilder делает это.) Хотя строки являются неизменяемыми для внешнего мира, код в mscorlib может изменять содержимое, поэтому StringBuilder создает строку с большим внутренним массивом символов, чем требует текущее содержимое, а затем добавляется к этой строке до тех пор, пока массив символов больше не является достаточно большим, чтобы справиться, и в этот момент он создает новую строку с большим массивом. Член длины строки также содержит флаг в своем верхнем бите, чтобы указать, содержит ли строка какие-либо не-ASCII-символы. Это допускает дополнительную оптимизацию в некоторых случаях.

Я подозреваю, что это было написано до того, как у меня появилась возможность работать с 64-битным CLR; Я подозреваю, что на 64-битной земле каждая строка занимает на 4 или 8 байтов больше.

РЕДАКТИРОВАТЬ: я написал сообщение в блоге совсем недавно, который включает в себя 64-битную информацию (и немного противоречит выше для x86 ...)

10 голосов
/ 16 февраля 2012

В принципе, для каждого строкового объекта требуются постоянные 20 байтов для данных объекта.Буфер требует 2 байта на символ.Оценка использования памяти для строки в байтах: 20 + (2 * длина).Итак, обычно Память в CLR для этой строки: 22 байта

Однако, пока мы передаем или отправляем эту строку на другой конец или для любого другого использования, нам не нужно столько памяти (нам никогда не нужны 20 байтовдля данных объекта).Таким образом, это зависит от типа кодировки, который вы выбираете, когда вы его используете.

Для кодировки по умолчанию для символа потребуется 1 байт.

Таким образом, для кодировки по умолчанию ответ равен 1 байту..

Вы можете проверить с этим кодом:

Encoding.Default.GetBytes("a"); //It will give you a byte array of size 1.
Encoding.Default.GetBytes("ABC"); //It will give you a byte array of size 3.
1 голос
/ 19 октября 2010

Если вы спрашиваете о размере string объекта, то неправильно спрашивать о его размере, без отладчика невозможно сказать, что именно это.Не уверен, что это возможно и с отладчиком.string использует указатели внутри.

Если вы спросите о размере последовательности символов, которые в нем содержатся, то это 4, потому что строки хранятся в UTF-16.Все символы в основной многоязычной плоскости кодируются двумя байтами.

...