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

UnixForum





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

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


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

2.3. Сокращение имен символов

В описании алгоритма поиска символов ELF было показано, что одним из факторов стоимости поиска является длина используемых символов. В случае успешного поиска строки необходимо полное совпадение сравниваемых строк, а в случае неудачного — совпадение только их общего префикса.

Для того, чтобы было проще использовать короткие имена, в однородном пространство имен среды программирования языка C предлагаются следующие правила. Имена, которые использует программист, напрямую отображаются в имена в файле ELF. То же самое справедливо и в некоторых других средах программирования, таких как традиционные Pascal и FORTRAN.

В средах программирования с более сложной обработкой символов используется трансформация имен. Наиболее упоминаемым в этом классе языков программирования является язык C++. Строка символа функция состоит из имени соответствующей функции, а также из описания списка параметров, классов, членом которых является функция, и пространств имен, в котором определен класс или функция. Это может приводить к использованию чрезвычайно длинных имен символов. На практике встречаются имена, содержащие более 1000 символов. В языке Ada из-за использования пространства имен пакетов это приводит к к очень длинным именам.

Для управления сложностью, возникающей в крупных проектав, а также для того, чтобы способствовать повторному использованию кода в языке C++ используется модель объектов и пространства имен. Поэтому в процессе разработки желательно сохранять имена символов неизменными. Но как только программа будет установлена, длинные имена становятся помехой. Это именно тот момент, когда человек может вмешаться и сократить имена.

В языке C++ наиболее важными классами являются те, в которых используются шаблоны и/или пространства имен и определения классов, имеющие большую глубину вложенности. Если такие классы являются частью интерфейса объекта DSO, то программист должен внести изменения. Более короткое имя класса может быть создано путем объявления нового общедоступного класса, выведенного из класса с длинным именем. Определение должно находиться в глобальной области видимости с тем, чтобы не использовать часть пространства имен трансформированного имени объекта. Символы, ассоциированные с этим новым классом, могут быть экспортированы, а имена исходного класса - нет. В результате этого имена, принадлежащие исходному классу, не будут удалены из таблицы нединамических символов, но это никак не скажется на этапе выполнения.

Класс-обвертка должен переопределить все невиртуальные функции-члены класса, что будет полезно при экспорте. Для этого потребуется выполнить определенную работу, и это может увеличить затраты времени выполнения за счет дополнительного вызова функции — вызова функции-обвертки. Обратите внимание, что определение этих функций как inline, не поможет, поскольку тогда вновь будет использоваться ссылка на оригинально длинное имя. Единственным способом избежать дополнительного вызова является определение соответствующих алиасов, что может оказаться громоздкими.

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


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