Главная » Просмотр файлов » Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003)

Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003) (1160769), страница 33

Файл №1160769 Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003) (Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003)) 33 страницаД. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003) (1160769) страница 332019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 33)

Здесь с помощью правил обычного поиска и АО1. отыскиваются полные зависимые имена. Зависимые неполные имена (которые уже прошли однократную обработку на первом этапе с помощью правил обычного поиска) теперь просматриваются только с помощью правил АРЬ, после чего полученный результат комбинируется с результатом обычного поиска из предыдущей стадии. Получившееся в результате множество используется для выбора вызываемой функции в процессе разрешения перегрузки. Хотя описанный механизм двухфазного поиска представляется особенно важным для реализации модели разделения, он используется и в модели включения.

Однако во многих ранних реализациях модели включения любой поиск откладывался до того момента, пока не будет достигнута точка инстанцирования . а 10.3.5. Примеры Приведем несколько примеров, наглядно иллюстрирующих описанный выше эффект. Первый пример относится к простой разновидности модели включения. севр1асе<сурепаюе Т> чо1б б1(Т х) ( д1 (х); О (1) эгобс( д1 (бпс) Контекст объявления — это множество всек объявлений, доступных в данной точке. а Такая реализация приводит к поведению модели включения, близкому к поведению механизма раскрытия макросов.

10<к Модель инстаицироваиия С++ 177 ?пс зпа?п() ( б1(7)] // ОШИБКА: не удается найти функцию д1() ) // (2): точка инстанцирования шаблона // Е1<1пс>(1пс) Вызов функции й1 (7 ) создает точку иистаицироваиия 11< 1цг> ( 1пт ] сразу после функции ша1п ( ) (в точке (2)). Главное в этом иистаицироваиии — поиск функции д1 ( ) . Когда компилятору впервые встречается шаблон функции й1 (], он выясняет, что неполное имя д1 является зависимым, поскольку функция с этим именем вызывается с зависимым аргументом (тип аргумента х зависит от параметра шаблона Т).

Поэтому в точке (1) поиск шаблона функции д1 осуществляется с помощью обычных правил; однако в этой точке функция д1 ие видна. В точке (2) (т.е. в точке инстанцироваиия) поиск функции осуществляется еще раз, причем он проводится в связанных с иею пространствах имен и классах. Поскольку единственный тип аргумента — 1пс, причем с ним ие связаны никакие пространства имен и классы, функция д1 () найдена не будет, несмотря на то что ее вполне можно обнаружить прн обычном просмотре в точке инстанцирования.

Второй пример демонстрирует, как модель разделения может привести к неоднозначности перегрузки в разных единицах трансляции. Пример состоит из трех файлов (один из которых заголовочный). // Файл сожжоп.?(рр: ехрогг Сешр1аее<гурепаше Т> 1с] б (Т); с1авв А ( )' с1авв В ( ); с1авв Х ( рц]э11с: орегасог А() ( гесцгп А() 1 ) орегагог В() ( гесцгп В(); ) // Файл а.срр: (]1пс1иде "сопапоп.]трр" чоЫ д (А) ( ) ?пс ша?п() ( б<Х>(Х() ) ' 178 Глава 10.

Инстанцированне // Файл Ь.срр: () зпс1иг)е "солавоп. Ьрр" чоЫ д(В) ( ) ехрогв Сещр1аее<сурепалзе Т> чозг) Е(Т х) ( д(х); ) В функции шазп(), содержащейся в файле а.срр, находится вызов функции й<Х> (Х () ), который разрешается с помощью экспортированного шаблона, определенного в файле Ь.

срр. В результате инстанцируется вызов функции д (х) с аргументом типа х. Поиск функции д ( ) осуществляется дважды: один раз с помощью правил обычного поиска в файле Ь. срр (где анализируется шаблон) и еще раз — с помощью правил АОЬ в файле а. срр (где шаблон инстанцируется). В процессе первого поиска обнару- ' живается функция д (В), а в процессе второго — д (А) . Наличие определенного пользователем преобразования типов делает обе эти функции жизнеспособными, так что вылов. функции Е<Хь(Х(] ) оказывается неоднозначным. Заметим, что в файле Ь.

срр нет и намека на то, по вызов функции д (х) может допускать двузначное толкование. Возможность неожиданного появления дополнительной функции-квндидата возникает из-за двухфазного механизма поиска. Таким образом, при написании и документировании экспортируемых шаблонов следует быль предельно осторожным. 10.4. Схемы реализации В этом разделе рассматриваются некоторые способы, с помощью которых различные реализации С++ поддерживают модель включения. Все эти реализации основываотся на двух классических компонентах: на комлиляшоре и компоновщике.

Компилятор преобразует исходный код в объектные файлы, которые содержат машинный код и символические обозначения (перекрестные ссылки на другие объектные файлы и библиотеки) Компоновщик создает исполняемые программы или библиотеки, соединяя объектные файлы в одно целое и разрешая содержащиеся в них перекрестные ссылки. Все, о чем пойдет речь далее, относится именно к такой модели, хотя вполне возможны другие спо собы реализации языка С++ (которые не приобрели широкой популярности). Например вполне можно представить себе интерпретатор С++.

Если специализация шаблона класса используется в нескольких единицах трансляции. компилятору придется повторить процесс инстанцирования в каждой из этих единиц. Количество возникающих в связи с этим проблем весьма незначительно, поскольку определе- (0.4. Схемы реализации 179 ння классов не генерируют непосредственно код низкого уровня. Зти определения используются только внутри реализаций С++ для проверки и интерпретации различных других выражений и объявлений. Таким образом, множественное инстанцирование определения класса, по сути, не отличается от многократного включения определения класса (обычно с помощью включения заголовочного файла) в разных единицах трансляции. Однако если происходит инстанцнрование шаблона (невстраиваемой) функции, ситуация может измениться.

Если использовать несколько определений обычных невстроенных функций, то это бы нарушило правило одного определения. Например, предположим, по компилируется и компонуется программа, состоящая из двух приведенных ниже файлов. // Файл а.срр: зпс ща5.п() // Файл Ъ.срр: зпг. щазп() Компиляторы С++ будут транслировать каждый модуль отдельно, причем без каких- либо проблем, потому что эти единицы трансляции, безусловно, являются корректными с точки зрения С++. Однако попытка связать эти два файла, скорее всего, вызовет протест компоновщика. Дело в том, что дублирование определений не допускается.

Рассмотрим теперь другой пример, в котором участвуют шаблоны. // Файл с.Ьрр: // Общий заголовочный файл (модель включения) сещр1асе<сурепаще Т> с1авв Я ( рцЬ11с: чоМ Т (); еетр1аее<еурепаще Т> УОЫ Я::й() // Определение функции-члена ( чоЫ Ье1рек (Я<Тле>*) // Файл а.срр: ((Тпс1ибе "С.Ьрр" чозс( Ье1рек(Я<1пс>* я) ( в->й()," // (З) Первая точка инстанцирования Я::Й Глава 10. Инстанцированис 180 // Файл Ь.срр: Ипс1ибе "с.)трр" йпс майн() Б<йпс> в; Ье1рек(ав) з в.й()з // (2) Вторая точка инстанцирования Я::й Если компоновщик рассматривает инстанцированные члены шаблонов точно так же, как обычные функции или функции-члены, то компилятор должен гарантировать, что он сгенерируст код только в одной из двух точек инстанцирования: в точке (1) или (2), но не в обеих. Чтобы достичь этого, компилятор должен перенести информацию из одной единицы трансляции в другую, а это никогда не требовалось от компиляторов С++ до введения шаблонов в этот язык.

Далее рассматриваются три популярных класса решений, получивших широкое распространение среди разработчиков реализаций языка С++. Заметим, что такая же проблема возникает во всех связываемых объектах, возникающих в результате инстанцирования шаблонов: как в инстанцированных шаблонах обычных функций и функций-членов, так и в инстанцированных статических данных-членах. 10.4.1. "Жадное" инстанцирование Первые компиляторы С++, которые сделали популярным так называемое жадное инстанцирование, были произведены компанией Вог!апд. С тех пор этот подход стал одним из самых распространенных методов среди различных систем С++.

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

Характеристики

Тип файла
DJVU-файл
Размер
5,6 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6417
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее