Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

На главную -> MyLDP -> Программирование и алгоритмические языки


Ulrich Drepper "Как писать разделяемые библиотеки"
Назад Оглавление Вперед

2.4.2. const - всегда константа

В результате, полученном в предыдущем разделе, все еще существует одна проблема: строка может модифицироваться. Очень часто строки никогда не изменяются. В подобном случае неразделяемый сегмент данных будет излишне большим.

const char str[ ] = "some string";

После добавления ключевого слова const компилятор сможет переместить строку в память, доступную только для чтения. Это не только улучшает использование в программе ресурсов и увеличивает скорость загрузки, а также позволиет отлавливать такие ошибки, как запись в эту строку.

Но это еще не все. Современные версии компилятора gcc и компоновщика могут работать совместно для выполнения кросс-объектной оптимизации. То есть строки, которые присутствуют в более чем в одном объектном файле, в полученном результате будут присутствовать только один раз. И даже больше: некоторые компоновщики везде, где это возможно при представлении строк в языке C, выполняют оптимизацию с использованием суффиксов. Для этого реализацию нужно выполнять так, чтобы строка, хвост которой совпадает с более длинной строкой (включающей в себя байт NUL), можно быть представить в виде байтов более длинной строки.

const char s1[ ] = "some string";
const char s2[ ] = "string";

В этом случае в сегменте данных, доступном только для чтения, будет запомнена только строка "some string". Символ s2 может представлять собой ссылку на пятый символ более длинной строки.

Чтобы это было возможным, компилятор должен помещать строковые данные в специально помеченную секцию. Секции помечаются флагами SHF MERGE и SHF STRINGS.

Однако, могут быть обработаны не все строки. Если в строке явно содержится байт NUL, в отличие от такого же, имеющегося неявно в конце строки, то строку нельзя помещать в эту секцию. Поскольку алгоритмы компоновщика используют байт NUL для поиска конца строки, то оставшаяся часть входной строки будет отброшена. Поэтому желательно избегать использовать строки с явными байтами NUL.


Предыдущий раздел:   Следующий раздел:
Назад Оглавление Вперед