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

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

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

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

Он должен объединить различные аргументы шаблона в единый тип, который переопределяст конструкции-члены гуребей, используемые по умолчанию. Такое объединение может быть достигнуто с использованием наследования. // Ро11суЯе1ессог<А,В,С,В> создает А,В,С,В как // базовые классы. Вйвсгйщйпагог<> позволяет иметь // несколько одинаковых базовых классов Сещр1аге<гурепаще Вазе, 1пг В> с1авв Вйвсгйщйпасог : райс Вазе ( ): сещр1асе <сурепаще Яессег1, сурепаще Яессег2, сурепаще ЯессегЗ, сурепатпе Яессег4> с1авв Ро11суяе1есгог : рпЫ1с Вйвсг1щзпагог<яеггег1,1>, риЬ11с Вйвсгбщйпагог<Яеггег2,2>, рпЬ11с В1всгйщйпагог<ЯесгегЗ,З>, риЫ1с В1всгйщйпасог<Яеггег4,4> Обратите внимание на использование промежуточного шаблона Мвсг1щ1пасог Он необходим для того, чтобы можно было иметь одинаковые типы яессег. (Иметь несколько непосредственных базовых классов одного и того же типа нельзя; обойти зто о1 раничение можно с помощью опосредованного наследования.) Теперь соберем в базовом классе все значения по умолчанию.

16.1. Именованные аргументы шаблона 313 // Именуем стратегии по умолчанию, как Р1, Р2, РЗ и Р4 с1авв Пейаи1ГРо11сйев ( риЫ1с ." сурег)ей Пебаи1СРо11су1 Р1/ сурег)ей Пебаи1ГРо11су2 Р2; сурег)ей пебаи1сро11суЗ РЗ; сурег)еб Эебаи1сро11су4 Р4; )' Однако вы должны быть внимательны и избегать неоднозначности при многократном насле- довании от этого базового класса, т.е. базовый класс должен наследоваться виртуально. // Класс для стратегий по умолчанию позволяет избежать // неоднозначности прн помощи виртуального наследования с1авв пейаи1сро11судгдз : чйгсиа1 риЫ1с Пебаи1сРо11сйев ( )' Наконец, нужно написать ряд шаблонов для переопределения значений стратегий, задан- ных по умолчанию. Сещр1асе <Сурепаюе Ро11су> с1авв Ро11су1 1в : чйггиа1 риЫ1с Пебаи1гро11сйев ( риЫ 1с: сурес)е1' Ро11су Р1; // Переопределение ); Сещр1аге <Сурепаще Ро11су> с1авв Ро11су2 1в : чйггиа1 риЫ1с Эебаи1сро11сйев ( риЫ1с: Суредей Ро11су Р2; // Переопределение Гетр1асе <Гурепаще Ро11су> с1авз Ро11суЗ 1в: чйггиа1 риЫ1с Пебаи1гро11сйев ( риЫ1 с: сурес)ей Ро11су РЗ; // Переопределение ); Сепр1аге <сурепке Ро11су> с1авв Ро11су4 1в : ч1гсиа1 риЫ1с Пебаи1сРо11сйев ( риЫ 1с: Сурег)ей Ро11су Р4/ // Переопределение Вернемся к сути нашего примера и инстанцируем Вгеас)Я 1 1сег< > следующим образом: Вгеас)я11сег<Ро11суз 1з<сивгощро11су» )эсг Дяя этого Вгеас)Я11сег<> тнп Ро11с1ев определен как Ро11суЯе1ессог<Ро11суЗ 1в<СивсощРо11су>, Пе1аи1СРо11суАгпв, Глава 16.

Шаблоны и наследование 314 )Зейац1тРо11судгдв, ))ебап1тро11судгдв> С помощью шаблона класса 1)йвстыпйпасот< > в результате будет получена иерархия, в которой все аргументы шаблона являются базовыми классами (рис. 16.1). Важное замечание: все эти базовые классы имеют один и тот же виртуальный базовый класс ))ейац1тРо11сйев, который определяет заданные по умолчанию типы для Р1, РЗ, РЗ и Р4.

Однако РЗ переопределен в одном нз порожденных классов, а)именно в классе Ро11суЗ 1в<>. Согласно так называемому прааилу доминирования (бопйпабоп пйе), зто определение скрывает определение базового класса Таким образом, здесь нет неоднозначносги . 2 Рис.!б.!. Иерархия типов ВгеасМ1!сег<>з зро1!с!ев Внутри шаблона Втеас)Б11сег можно обращаться к четырем стратегиям, используя дпя этого квалифицированные имена наподобие Ро11сйев:: РЗ.

семр1аге <... > с1авв Втеас)811сег ( рцЫ 1с: зтойс) ргйпг () ( Ро1хсхев::РЗ::с)оргйпс()! Полный исходный текст можно найти в файле 1п)хетаг/пааейсар1 . срр. з Определение правила доминирования можно найти в разделе 10.2/б Станларта С++ [31) а также в [15), раздел 10.1.1. 16.2. Оптимизация пустого базового класса 315 Здесь разработана методика для четырех параметров шаблона, но очевидно, что эта методика применима для любого разумного количества таких параметров. Обратите внимание, что при этом нигде не было реального инстанцирования обьекта вспомогательного класса, содержащего виртуальные базовые классы.

Следовательно, тот факт, что они являются виртуальными базовыми классами, не влияет на производительность или потребление памяти. 16.2. Оптимизация пустого базового класса Классы С++ часто бывают пустыми, т.е. их внутреннее представление не требует выделения памяти во время работы программы. Зто типичное поведение классов, которые содержат только члены-типы, невиртуальиые функции-члены и статические данные- члены.

Нестатические данные-члены, виртуальные функции и виртуальные базовые классы требуют при работе программы выделения памяти. Однако даже пустые классы имеют ненулевой размер. Если вы хотите зто проверить, попробуйте запустить приведенную ниже программу. // 1п)зегйс/ешрсу.срр ()1пс1ис[е <йовсгеат> с1авв ЕтргуС1авз ( ); йпГ пшйп ( ) ( вЫ::собес « "вйяеоб(ЕмрсуС1анв): " «вйяеоб(ЕшркуС1авв) « '~п'; ) На множестве платформ эта программа будет выводить в качестве размера ЕшрсуС1авв число 1. Некоторые системы налагают на типы классов требования выравнивания и могут выводить другое небольшое значение (обычно 4).

16.2Л. Принципы размещения Проектировщики С++ имели множество причин избегать классов с нулевым размером. Например, массив классов, имеющих нулевые размеры, также имел бы нулевой размер, но при этом арифметика указателей оказалась бы неприменима. Пусть, например, ЕегоЯйкес[Т вЂ” тип с нулевым размером. ЕегоЕ1гебт я [10] йа[1] — аз[31 // Вычисление расстояния междУ /'/ указателями/адресами Глава 16. Шаблоны и наследование 316 Обычно разность из предыдущего примера получается путем деления числа байтов между двумя адресами на размер объекта данного типа. Однако, если этот размер нулевой, понятно, что такая операция не приведет к корректному результату.

Тем не менее даже при том, что в С++ нет типов с нулевым размером, стандарт С++ устанавливает, что, когда пустой класс используется в качестве базового, память для него не выделяется при условии, что зто не приводит к размещению объекта по адресу, где уже расположен другой объект или подобьект того же самого типа. Рассмотрим несколько примеров, чтобы разъяснить, что означает на практике так называемая онтимизаиия пустого базового класса (ешр(у Ъазе с)азя ор(ппааг(оп — ЕВСО).

Рассмотрим приведенную ниже программу. // ЕпЬег1с/еЬсо1.срр 41пс1ис)е <1овсгеаза> с1авв Емрсу ( сурес)ей 1пе Хпгз // куреней не делает класс непустым ); с1авв ЕшреуТоо : риЬ11с Езаргу ( ); с1авв ЕмрсуТЬгее : риЬ11с ЕмрсуТоо ( ): Епс пайп() ( "«вйзеоб(Ещреу) Если ваш компилятор осуществляет оптимизацию пустого базового класса, то он выведет один и тот же размер для каждого класса (но ни один из этих классов не булез иметь нулевой размер (рис. 16.2). Это означает, что внутри класса ЕлзргуТоо классу Емрсу не выделяется никакое пространство.

Обратите внимание и на то, что пусюн класс с оптимизированными пустыми базовыми классами (при отсутствии непустых базовых классов) также пуст. Это объясняет, почему класс ЕщркуТЬКее может иметь тот же размер, что и класс Елзрку. Если же ваш компилятор не выполняет оптимизацию пус того базового класса, выведенные размеры будут разными (рис. 16.3). Рис. 1б.2. Размещение втрсуть сев компилятором, который реализует ЕВСО вМ::соис « « вМ::соис « « вЫ::соис « « "вйяеот(Емреу): '~п'; "вйхеоб(ЕщргуТоо): "«вйкеой(ЕмркуТос) '~п'; "вйхеоб(ЕюрсуТЬгее): "«взхеоб(ЕмрсуТЬгее) '~п'; 16.2. Оптимизация пустого базового класса 317 яирезтькее Рис /б.З. Размещение Впреутикее каиоиеияорам, который ие реализует ЕВСО Рассмотрим пример, в котором оптимизация пустого базового класса невозможна. // 1пЬег1п/еЬсо2.срр е1пс1пс)е <1овсгеав> с1авв Еврсу ( сурее)ей 1пс 1пс; // суредей не делает класс непустым ); с1авв ЕврсуТоо : рпЬ11с Еврсу ( с1авв ЫопЕврпу : рпЬ11с Еврсу, рпЬ11с ЕврпуТоо ): 1пп заа1п() ( впе)::оопп « «в1кео1(Еврпу): « в1кео1(Еврпу) « '1п'; вЫ::сопп « ев1кеой(ЕврпуТоо): « в1кеоб(ЕврсуТоо) « '1п'; вам::сопс « "в1кеот(ЫопЕврсу): « в1кеой(ЫопЕврпу) « '1п'; Может показаться неожиданным, что класс ыопеврсу не пустой.

Ведь ни он, ни его базовые классы не содержат никаких членов. Но дело в том, что базовые классы епрсу " ЕВрсуТОО Кяаееа ЫОПЕВрпу НЕ МОГут 6ЫтЬ раЗМЕщЕНЫ ПО ОдНОМу И тОМу жЕ адрЕСу, поскольку это привело бы к размещению объекта базового класса еврсу, принадлежащего классу ЕврсуТоо, по тому же адресу, что и объекта базового класса Еврпу, при"аллежащего классу ыопеврсу. иными словами, два подобъекта одного и того же типа "аходились бы в одном месте, а это не разрешено правилами размещения объектов языка С++ Можно мысленно представить, что один из базовых подобъектов еврсу помещен со смещением 0 байт, а другой — со смещением 1 байт, но полный объект ыопеврсу асе равно не может иметь размер а один байт (рис. 1б.4).

Глава 1б.Шаблоны и наследование 318 вирек аиоъу . якръзаоо Рис. 1б.4. Размещение объекта Нопквреу комтииниором, реализующим ЕВСО Ограничение на оптимизацию пустого базового класса можно объяснить необходимостью проверки, не указывают ли два указателя на один и тот же объект. Поскольку указатели внутренне почти всегда представлены как обычные адреса, необходимо гарантировать, что два различных адреса соответствуют двум различным объектам. Это ограничение может показаться не очень существенным, однако с ним часто приходится сталкиваться на практике, поскольку многие классы наследуются из небольшого набора пустых классов, определяющих некоторое общее множество синонимов имен типов. Когда два подобъекта таких классов оказываются в одном и том же полном объекте, оптимизация запрещена.

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

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

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

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