2010-10-19 2 views
20

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

string abc = "a"; 
+3

это занимает 17 байт в источнике. уточните свой вопрос. вы думаете в памяти во время выполнения, когда закодированы в байт [], ... –

+3

Вам нужно будет прояснить некоторые вещи, например: Эта строка, где вы собираетесь ее сохранить? В памяти, как .NET типа «строка»? В файле? С какой кодировкой? Почему Вы заинтересованы? Если в.NET, каждая дополнительная строка с одним и тем же содержимым не обязательно использует намного больше памяти, поскольку старый может быть повторно использован. – Onkelborg

+2

Этого недостаточно, чтобы вы действительно не беспокоились об этом :-) – paxdiablo

ответ

27

С моей article on strings:

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

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

EDIT: Я написал blog post совсем недавно, который включает в себя 64-битовую информацию (и противоречит выше немного для x86 ...)

+0

Ну, это делает строку очень непопулярный, если вы хотите хранить большое количество из них в памяти ... –

+0

Итак, 1-символьная строка займет 20 байт в соответствии с вашей статьей. И 20 байтов - это данные объекта. Где хранится символ? :-) – meze

+0

@meze: Не уверен, что вы подразумеваете под «20 байт - это данные объекта». Не могли бы вы уточнить? Также см. Http://msmvps.com/blogs/jon_skeet/archive/2011/04/05/of-memory-and-strings.aspx для получения более подробной информации - добавьте, что в. –

1

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

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

9

В принципе, для каждого строкового объекта требуется 20 байтов для данных объекта. Буфер требует 2 байта на символ. Оценка использования памяти для строки в байтах: 20 + (2 * Length). Итак, нормальная память в 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. 
+0

Это не имеет значения. Это зависит от выбранного вами типа кодирования, когда вы их используете. –

+1

Это лучше. Удалено проголосовало. –

Смежные вопросы