Подтвердить что ты не робот

Как строки выглядят с точки зрения компилятора?

В C компилятор имеет указатель на начало строки и имеет конечный символ ('\0'). Если пользователь хочет рассчитать длину строки, компилятор должен подсчитывать элементы массива строк до тех пор, пока не найдет '\0'.

В UCSD-strings компилятор имеет длину строки в первых символах.

И что компилятор думает о C#-strings? Да, с точки зрения пользователя String есть object, у которого есть поле Length, я не говорю о материалах высокого уровня. Я хочу знать глубокие алгоритмы; например, как компилятор вычисляет длину строки?

4b9b3361

Ответ 1

Введите следующий код:

string s = "123";
string s2 = "234";
string s3 = s + s2;
string s4 = s2 + s3;
Console.WriteLine(s + s2);

Теперь поставьте точку останова на последней строке и откройте окно памяти:

Строки

Написание s3 в окне памяти мы можем видеть строки 2 (s3 и s4), выделенные один за другим с 4 байтами размера в начале.

Также вы можете видеть, что выделена другая память, такая как токен типа strings и другие данные класса string.

string class сам содержит элемент private int m_stringLength;, который содержит длину string, это также делает string.Concat() выполнить супер быстрый (путем выделения всей длины в начале):

int totalLength = str0.Length + str1.Length + str2.Length;

String result = FastAllocateString(totalLength);
FillStringChecked(result, 0, str0);
FillStringChecked(result, str0.Length, str1);
FillStringChecked(result, str0.Length + str1.Length, str2);

Я немного странно понимаю, что реализация IEnumerable<char>.Count() для string выполняется с использованием реализации по умолчанию, которая означает повторение элементов по одному в отличие от ICollection<T> как List<T>, где IEnumerable<char>.Count() реализуется посредством используя свойство ICollection<T>.Count.