Пул строк
Пул строк (англ. string pooling) относится к двум видам оптимизации компилятора, связанным со строками:
- Снижение объёма кода путём объединения одинаковых строк из разных модулей.
- Ленивые присваивания строк с использованием счётчика ссылок (copy-on-write).
Объединение строк из разных модулей
правитьПри обработке исходного кода компилятор должен каждую литеральную строку поместить в метаданные управляемого модуля. Если одна строка встречается в исходном коде много раз, размещение всех таких строк в метаданных приведет к росту результирующего файла.
Чтобы не допустить роста объёма кода, многие компиляторы (в том числе компилятор C#) хранят литеральную строку в метаданных модуля только в одном экземпляре. Все упоминания этой строки в исходном коде компилятор заменяет ссылками на её экземпляр в метаданных. Благодаря этому заметно уменьшается размер модуля. Способ не новый — в компиляторах C/C++ этот механизм существует уже давно. В компиляторе Microsoft C/C++ это называется созданием пула строк (string pooling). Это ещё одно средство, позволяющее ускорить обработку строк.
Ленивые присваивания строк
правитьОбычно строка — это объект большого размера, требующий для своей работы выделения большого блока памяти. Данная оптимизация выделяет память под строки только при надобности, позволяя нескольким переменным указывать на одну цепочку символов. Только если одна из переменных меняет своё содержимое, строка копируется.
Подобная оптимизация существует в языках со сборкой мусора в таком виде: строка является неизменным объектом, и присваивание a=b
не создаёт новой строки. Недостаток этого решения в том, что программист должен знать и использовать внутренний механизм построения строк наподобие StringBuilder
(Java).
Литература
править- Рихтер Дж. CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C#. Мастер-класс.
Ссылки
править- Все о String.intern() : для чего пул строк используется в Java