Pull to refresh

Comments 5

Спасибо за инфу. Всю жизнь думал, что строка в памяти - это байты, которые заканчиваются нулём.

С уникодом не совсем понял. Ведь у него не одинаковые длинны одного символа, там UTF-8, UTF-16. т.е. неважно, какой формат мы берём - в памяти держится всегда UTF-16?

Длина строк ограничивается нулём в C/C++ и многих других языках, но в .NET и Pascal например не так.

В памяти UTF-16, поэтому свойство Length может быть больше чем реальное количество символов, даже если нормализовать в композитную форму, потому что суррогаты. Из-за этого например ограничивать длину произвольной исходной строки, путём использования Substring нельзя, потому что можно разрезать суррогат посередине и получить невалидный символ (только начало пары). Для правильного разделения есть тип StringInfo.

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

А вы уверены про "extra field" 4 байта? Если моя память меня не подводит лейаут у строки как раз [8b header][8b pMT][4b Length][data...

И ещё у вас ссылки на исходную имплементацию NativeAOT, это немного другое чем CLR/JIT

Sign up to leave a comment.

Articles