GCC - The Complete Reference (537669), страница 27
Текст из файла (страница 27)
Если "в" предшествует индикатору типа данных сьаг, тО ИМЕЕТ ЗНаЧенИЕ Ре1дпеа. Например, имя функцииирьг «рад[в)длеасьаг) кодируется как ра«1 аирьас. Экземпляр шаблона кода на языке С++. Повторение предыдущего типа аргумента. Квалификатор типа ограниченного указателя. Модификатор, означающий беззнаковый целочисленнный тип данных.
Он также используется как модификатор для имени класса нли имени именованного пространства, указывающий на символьную кодировку Оп(со()е. Число букв в имени пользовательского типа данных. Например, имя функции ирь«град(сьвг, вг1Р, еовь1е) будет закодировано как Рад зирьс4аг1ра. числу 4 не обязательно должна предшествовать буква о, те. Рад зирьсаагкра эквивалентно Рвд зирьсо4агзрв. Массивы. Массивы в языке С++ всегда раскладываются на указатели, так что этот тип в действительности нигде не встречается. В языке дауа массив кодируется как указатель на тип алггау. Тип данных ьоо1 С++, или тип данных ьоо1еав языка Дауа. Для языка С++ тип данных сЬвг, или для Дауа тип данных Ьуге.
Модификатор, показывающий тип аргумента соввг или включаемую функцию. Тип данных ВоиЬ1е. дополнительные аргументы неизвестных типов, например, имя функции ирьг град(1вг, ... ) кодируется рвд зирь1е. Тип даннных 11овг. 1 24 Часть )!. Использование Сборного Компилятора Юуявв явяв йнвчвннв тип данных чс1а. Модификатор, который показывает тип данных чсзвсьте. Для языка С++ тип данных иъсвк Х или Для чача тип данных съак. Для С++ тип данных 1спа 1спа или для азха тип данных 1спа. Указывает нв использование типа шаблона ()егор)вге) в аргументе. Указывает нв использование в аргументе типа константного шаблона (сопз!вп! !егор!в)Е.
В состав пакета утилит Ь)вв())я входит деманглер (от таегпапя)е") — программа с++Е11Е. Вы можете ввести замененное имя функции в качестве параметра команды запуска этой программы и получить имя функции таким, каким оно было до замены. Вот пример применения этой программы: й счьЕ11Е ргтрк Зирвзцвагте Мрв:гргвт(1пв, впвьяпеб ввокв, сов)р1ех гьовЬ1е, ...) Утилита сч +Ех1е способна обрабатывать имена, замененные в соответствии с целым рядом применяющихся схем замены, Применяемая схема выбирается параметром опции командной строки -в. Доступны варианты выбора платформ (1цсйгт, акта, Ьр и еад) и опции выбора языков (леча, диас).
Схемы замены имен файлов (талл)гля залетел), используемые для С++ и гака, вообще говоря„совместимы между собой, но с другими компиляторами они не дружат. Каждый компилятор использует собственную схему замены имен, что, конечно, оправдано. Также отличаются схемы расположения классов, обеспечивающие выполнимость множественного наследования и применяющиеся в технологии поддержки виртуальных функций.
Когда применяются совместимые схемы, то существует возможность компоновки модулеи объектного кода ОСС с библиотеками, вырабатываемыми другими компиляторами. Оо при этом нельзя твердо рассчитывать на то, что программы будут нормально запускаться и правильно работать.
Компоновка программ (БМаяе) В объектном файле находится не только исполняемый код, но и некоторая информация, имеющая значение для ряда действий оптимизации и для нахождения расположения кода при разрешении ссылок. Некоторая часть этой информации относится к категории "неопределенной компоновки" (чадце!)п)гале), потому что она представляет собой нечто иное, чем результат обычного процесса простого сопоставления имен с соответствующими им адресами.
Здесь приводится неполное описание элементов "неопределенной компоновки" реализации языка С-ь-ь в компиляторе !з)к)(). Таблица виртуальных функций (ЧИиа! Ецпст)оп ТаЫе) Это список адресов виртуальных функций класса. Если класс д содержит виртуальную функцию и эта функция замещена подклассом в, то в этом случае адрес Глава б.
Компиляция программ на языке С++ 125 первоначальной функции заменяется адресом новой функции в таблице виртуальных функций — ягаЫе. Это сделано для того, чтобы соблюсти требования полииорфизма. В нашем случае, когда объект класса в замещает объект класса д, тогда вызов виртуальной функции класса А использует эту таблицу и в соответствии с яей осуществляет вызов функции из класса в, а не л. Идентификация типа объекта во время выполнения программы (йипт(п$е Туре Ыепт!Йсат$оп) В языке С++ каждый объект содержит идентификационную информацию для обеспечения действий таких операторов как бупаю1с оввс и еуре1й, и для обработки исключений.
Для классов, содержащих виртуальные функции, вместе с таблицей гШЫе включается блок информации, по которому ~$упвзя1с савв во время выполнения программы может определить тип интересующего объекта. При отсутегвии таблицы «ГаЫе (это означает что класс неполиморфичен), этот блок инфориации помещается только в ту область объектного кода, где используется этот класс. СОМ ОАТ При использовании объявления повязав в заголовочном файле можно добиться того, что при каждой компиляции копия вырабатываемого кода будет включаться но все модули, использующие этот заголовочный файл.
Это касается таких вещей, как глобальные переменные и функций, тело которых объявляется как часть определения класса. На поддерживающих СОМРАТ системах (компоновщик ОХ() на БЕГ-системах, таких как $лпцх, Яо!апз, М!сгозой Ък)пооугз и др.) компоновщик самостоятельно распознает и удаляет все лишние копии такого кода, кроме единственной, которая должна быть помещена в результирующей выполнимой программе. В документации по компоновщику (11п)гег) вы можете найти описание этого по ключевым фразам уо!Сйпй, сошва! Ыв!пй, и(еп($еа! сопи!а! Го!в(пй, еопи$а! й(яеап$!пй или даже (гава1$1те сопи$а! ейпйпабоп. Функции, расширяемые подстановкой кода (1и! 1пе Г$$пст$опз) Расширяемая подстановкой кода (1п!1пе) функция, как правило, объявляется в заголовочном файле (пеаг(ег В1е), подключаемом любым модулем, нуждающемся в вызовах этой функции.
Даже когда функция объявляется как 1п11пв, все же создается ее объектный код на тот случай, когда она не может быть расширена подстаяовкой, например при обращении к ней по адресу Экземпляры компилируемого шаблона (Совр!Ипя Тевр!аде 1п~~апбабопз) При помещении определения шаблона (гегпр!аге) в заголовочном файле и вклюяеняи этого файла во множество модулей создается соответствующее множество копай скомпилированного шаблона. Этот подход будет работать, однако в большой программе с большим количеством шаблонов в каждый объектный файл будут повещены скомпилированные копии каждого шаблона, Это может значительно уве- 126 Часть !!.
Использование Сборного Компилятора личить время компиляции и размер объектных файлов. Для решения этой проблемы существует несколько альтернатив: ° Возможно использование директив йргаотаа 1пеаггаоа и йргаятаа 1шр1ашапеаейоп в исходных файлах (это описано выше в этой главе), это приводит к созданию единственной скомпилированной копии шаблона.
° Способ, подобный использованию двух прагма-директив, состоит в применении при компиляции всего исходника опции -ба1е-ехеегпа1-еаар1аеав. Она указывает компилятору включать экземпляр скомпилированного шаблона только в тех модулях, которые действительно его используют. я Компиляция исходного кода с применением опции командной строкиг гаро. Это приводит к созданию файлов с суффиксом . гро, каждый из которых содержит список включений экземпляров шаблона, которые можно найти в соответствующем объектном файле. Затем следует задействовать оболочку компоновщика — утилиту оо11аее2 для дополнения файлов . гро инструкциями компоновщику относительно расположения шаблонов в результирующей программе. Единственная трудность применения этого подхода касается библиотек.
Трудность состоит в том, что до тех пор, пока не будут удалены соответствующие файлы . гро, компоновка находящихся в библиотеке шаблонов происходить не будет. ° Использование при компиляции кода опции -гпо-йвтр11ойе-еавр1аеав, которая отменяет подразумеваемое применение шаблона и выполняет только указанную вами подстановку. Этот подход предусматривает, что вы точно знаете, какие экземпляры шаблона следует использовать. Этот подход приводит к выработке наиболее точного и чистого кода. Кемиииииии ириерамм ии языке ИЫейие-К А лгоритмический язык ОЬ1есГ(те-С вполне можно считать расширением языка программирования С.