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

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

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

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

Если же подобная библиотечная функция будет применяться для вычисления нескольких миллионов скалярных произведений, то производительность ее работы приобретает важное значение. Разумеется, можно было бы не вызывать функцию йос ргойисс (), а написать код для непосредственного вычисления скалярного произведения нли разработать специальные функции для вычисления скалярного произведения одномерных массивов с одним, двумя, тремя и т.д. компонентами (что довольно утомительно). Шаблонное метапрограммирование помогает в решении этой задачи. Нужно организовать цикл так, как показано в приведенной ниже программе. // шева/1оор2.Ьрр 41гпйег [ООР2 НРР ййеб1пе [ООР2 НРР // Первичный шаблон.

сешр1асе <1пс 01м, сурепаше т» с1авв ()оаргойисг ( ррцЬ11с: вгалйс Т геви1С(Т« а, Т* Ь) ( гесигп *а * «Ь + посргойисс<()1м-1,т»::гевц1г(а+1,Ь+1) г // Частичная специализация критерия окончания рекурсии сешр1асе <аурепаше Т» с1авв ПФСРгойисс<1,Т» ( риЬ11с: вгаа1с Т геви1С (Т* а, Т* Ь) [ гесигп *а * «Ьг // Функция для вычисления скалярного произведения сешр1аае <3пс э1М, сурепаше Т» 1п11пе Т йос ргойиса(Т* а, Т* Ь) 17.7. Метапрограммы для развертывания циклов 341 ( геТигп роТРгос)исТ<01М,Т>::геви1Т(а,Ы; ()епс)1Е // ЬООР2 НРР Теперь достаточно лишь немного изменить приложение, чтобы получить тот же результат, что и раньше. // гвеТа/1оор2.срр ()Тпс1ис)е <1овсгеат> ()йпс1ийе "1оор2.Ьрр" 1пТ шайп() ( Тпса(3) = (1, 2, 3); 1пТ ЫЗ) = ( 5, б, 7); "с)оТ ргодисТ<3>(а,Ы с(оТ ргос)исТ<3>(а,Ы '~п'; "доТ ргодисТ<3>(а,а) ЙоТ ргог)исТ<3>(а,а) '~п'; вТг)::соиТ « « « вТс)::соиТ « « « Вместо инструкции с)оТ ргойисТ!З,а,Ы мы применяем инструкцию с)оТ ргог(пот<3> (а, Ь) В этом выражении инстанцируется функция с)оТ ргос)ист, вызов которой преобразуется в следуюший код: ))оТРгос)исТ<3,1пт>::геви1Т(а,Ы Это и служит началом метапрограммы.

В теле метапрограммы переменной геви1Т присваивается сумма произведения первых элементов массивов а и Ь и скашуного произведения массивов, количество элементов в которых на единицу меньше, чем в исходных массивах а и Ь. Это скалярное произведение равняется предыдущему за вычетом произведения первых элементов массивов а и Ь. Тетр1аее <Тпе О1М, Турепагве Т> с1авв ОоТРгос)исТ ( риЬ11с: веасйс Т геви1Т (Т* а, Т* Ы ( гетигп *а * *Ь + Глава 17. Метапрограммы 342 йоергог)исг<Шю-1,Т>::геви1с(а+1,Ь+1)г Критерий окончания — снижение количества компонентов вектора до единицы. Сетр1асе <Гурепазае Т> с1авв )ЗоГРгог)иск<1,Т> ( риЬ11с: всагйс Т геви1Г (Т* а, Т* Ь) ( гесигп *а * *Ьг Таким образом, процесс инстанцирования функции с)ос ргос)иск<3>(а,Ь) будет выглядеть так: Рогргос)иск<3, 1пс<:: геви1г (а, Ь) *а * *Ь + ))оГРгог)иск<2,1пс>::геви1С(а+1,Ь+1) = *а * *Ь + *(а+1) * *(Ь+1) + ))огргос)иск<1,1пе>:ггеви1Г(а+2,Ь+2) *а * *Ь + *(а+1) * *(Ь+1) + *(а+2) * *(Ь+2) Заметим, что при такой методике программирования нужно, чтобы количество элементов массива было известно во время компиляции (что справедливо хотя и часто, но далеко не всегда).

В таких библиотеках, как В(йх++ (4), МП (25) и РООМА (30) метапрограммы, подобные рассмотренной выше, используются в быстрых подпрограммах линейной алгебры. Такие мешпрограммы работают лучше, чем оптимизаторы, поскольку они ассимилируют в себе знания более высокого уровня'. В промышленной реализации этих библиотек используется намного больше приемов, чем рассматривается в данной главе.

Например, необдуманная организация циклов не всегда приводит к оптимизации работы программы; однако эти дополнительные инженерные подробности выходят за рамки нашей книги. 17.8. Заключение Как уже упоминалось, автором первой опубликованной метапрограммы был Эрвин Анрух, представляющий на заседании Комитета по стандартизации С++ компанию Я(ешепз. Он заметил, что процесс инстанцирования шаблонов обладает вычислительной полнотой, и продемонстрировал это положение, разработав свою первую метапрограмму. Прн этом был использован компилятор Ме(азчаге, выдающий в процессе трансляции В некоторых случаях метаирограммы работают намного быстрее, чем соответствующие программы на языке Еопгао, несмотря на то, что оптимизатор языка Роигао, как пРавило, хорошо приспособлен именно для работы с приложениями такого вида.

]7.8. Заключение 343 данной программы сообщения об ошибках, номера которых образуют последовательность простых чисел. Ниже приведен код упомянутой программы, обсулгдавшийся на заседании Комитета по стандартизашзи С++ в [994 году (модифицированный для работы со стандартными современными компиляторами) . з // шеха/ипхззЬ.срр // Вычисление простых чисел по Эрвину Анруху Сешр1ахе <хпС р, хпС 1> с1авв хв рг1ше ( риЫ хо: епша ( Ргхш = (Р==2) ) ] (РЪ1) ай з.в ргйше<(з.>2?р:0),х-1>з:рг1га Сешр1ахе<> с1авв хв ргхше<0,0> ( риЫ1с: епшп (ргхш=1)з Сешр1ахе<> с1авв 1в рг1ше<0,1> ( риЫ1с: епиш (рг1ш=1); Сешр1ахе <хпС х> с1авв [З ( рцЫхо: р (чо1с]*); Сешр1асе <хпС 1> с1авв Рг1ше ргхпС ( // Первичный шаблон, в котором организован // цикл для вывода простых чисел РиЬ1з.с з Ргзле ргз.пС<х-1> а; еппш ( рг1ш = з.в рг1ше<1,х-1>:зргйл )г чо1с] х() 3 Выражаем благодарность Эрвину Анруку за предоставление зтого кода для данной книги.

Оригинальный ваРиант кола можно найти в [38]. Глава 17. Метапрограммы 344 О<1> с) = рт1ш ? 1: О; а.й(); ) ) еешр1асе<> с1авв Рг1ше рг1пт<1> ( // полная специализация шаблона // для завершения цикла риЬ11с: епшв (ргйш=О); 1с) б() ( 0<1> с) = ртйш 7 1: Ос ()1тпс)ет ЬАЯТ ()с)е61пе 1АЯТ 18 ()епЖЙ Япс пайп() ( Рг1ше рг1пс<(АЯТ> а; а.б(); В процессе компиляции этой программы компилятор выводит сообщения об ошибках, если в функции Ргйше ргйпс:: Е ( ) не удается инициализировать переменную г1 Это происходит, когда начальное значение равно 1, поскольку конструктор определен только для типа чойс1*, а к этому типу корректно преобразуется лишь значение О.

Например, один из компиляторов среди других сообщений выдает такие: Впервые концепция шаблонного метапрограммирования на С++ стала популярным инструментом программистов благодаря статье Тодда Вельдхаузена (ТеЫ Че16Ьо)аеп) иптиЬ.срр:36 ипгиЬ.срр:36 ипгиЬ.срр:36 ипхиЬ.срр:36 ипгиЬ.срр:36 ипгиЬ.срр:36 ипгиЬ.срр:36 сопчегвйоп антош '1це' Ео поп-вса1аг туре '1)<17>' сопчегвбоп антош '1пт' со поп-вса1аг туре '()<13>' сопчегвйоп антош '1пс' со поп-вса1аг суре 'В<11>' сопчегвйоп антош '1пт' со поп-вса1аг суре '))<7>' сопчегвйоп антош '1пт' со поп-вса1аг суре 'В<5>' сопчегв1оп бгош '1пс' со поп-вса1ат туре '))<3>' сопчегв1оп антош '1пт' Со поп-вса1аг Суре 'О<2.

' тес)иевтес) тес(иевеес) гес1иевтес) тес)иевеес) тес(иевсес) тес)иевтес) тес(иевсес) 17.8. Заключение 345 Уг(ля С++ Тетр!аье Мегарго8гапи (Использование шаблонных метапрограмм в С++) (40]. Работа Тодда над библиотекой В(их++ (библиотека численных функций С++„выполняющих действия с массивами) (4] также внесла многие усовершенствования и дополнения в метапрограммирование (в частности, в методы применения шаблонов выражений, которые рассматриваются в следующей главе).

Глава 18 Шаблоны выражений В этой главе описывается метод шаблонного программирования, известный под названием шаблоны выражений. Впервые этот метод возник при работе с классами числовых массивов, и именно в таком контексте он рассматривается в данной главе. Класс числовых массивов поддерживает выполнение числовых операций с массивом как с целостным объектом.

Например, к двум массивам можно применить операцию сложения; в результате ее выполнения получим массив, каждый элемент которого будет суммой соответствующих элементов исходных массивов. Аналогично, массив можно умножить на скаляр. Это означает, что на скаляр умножается каждый элемент исходного массива. Возникает естественное желание реализовать для массивов операторные обозначения, так знакомые нам по работе со встроенными скалярными типами.

Аггау<с)оиЬ1е> х(1000), у(1000) х = 1.2*х + х*у; Для серьезных высокопроизводительных вычислительных комплексов важно, чтобы выражения такого рода вычислялись настолько эффективно, насколько можно ожидать от платформы, на которой выполняется этот код. Достичь того, чтобы такие вычисления можно было выполнять с помошью компактной записи, приведенной в рассмотренном выше примере, — задача далеко не тривиальная, однако при ее решении на помошь приходят шаблоны выражений.

Шаблоны выражений напоминают шаблонное мепшрограммирование. Частично это объясняется тем, что иногда они опираются на глубоко вложенное внстанцирование шаблонов, которое не отличается от рекурсивного инстанцироаання, встречающегося в шаблонном метапрограммировании. Не исключено, что на сходство этих двух методов также повлияло то, что оба они первоначально разрабатывались для поддержки высокопроизводительных операций с массивами (обратитесь к примеру применения шаблонов для развертывания циклов в разделе 17.7, стр. 338). Зги два метода, несомненно, допол"яют лруг друга. Например, метапрограммирование удобно применять для небольших массивов фиксированного размера, а шаблоны выражений весьма эффективны для выполнения операций со средними и большими массивами, размеры которых задаются во время работы программы, Глава 18.

Шаблоны выражений 348 18.1. Временные объекты и раздельные циклы Чтобы обосновать применение шаблонов выражений, рассмотрим несложный (возможно, даже наивный) подход к реализации шаблонов, позволяющих выполнять операции с числовыми массивами. Основной шаблон массива мог бы выглядеть, как показано ниже (имя ЯАгх ау обозначает простой массив — яппр1е япау). // ехргхтпр1/ваггау1.)хрр ()хпс1ибе <всббей.)х> Мхпс1цбе <саввегх> Хешр1ахе<гурепахпе Т> с1авв ЯАггау ( рц)>1хс: // Создание массива укаэанного размера ехр1хсхс ядггау(в1хе Х в) вгогаде(пем Т[в)), вгогаде вххе(в) ( хпйхв(); ) // Конструктор копирования ЯАггау(ЯАггау<Т> сопвгй огхд) :вгогаде(пем Т[огхд.вххе())),вгогаде айве(огхд.вхке()) сору(огхд)р ) // деструктор: освобождение памяти -ЯАггау() ( бе1ехе[) всогаде; ) // Оператор присвоения ЯАггау<Т>й орегагог = (ЯАггау<Т> сопвхй огхд) ( хй (йогйд ! = с)тхв) ( сору(оххд); гегпгп *Г)ххв; // Возврат размера вйхве х вйхве() содах ( гехцгп вхогаде вххе) ) // Оператор индексации для констант и переменных 18.1.

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

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

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

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