Главная » Просмотр файлов » С. Мейерс - Эффективный и современный C++

С. Мейерс - Эффективный и современный C++ (1114942), страница 12

Файл №1114942 С. Мейерс - Эффективный и современный C++ (С. Мейерс - Эффективный и современный C++) 12 страницаС. Мейерс - Эффективный и современный C++ (1114942) страница 122019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Этот объ­ект не имеет имени, но для упрощения нашего рассмотрения я буду называть егоt emp. Для t emp вызывается o p e r a t o r [ ] , в результате чего возвращается объектs t d : : vecto r<boo l > : : re ference, содержащий указатель на слово в структуре данных,хранящей интересующий нас бит (эта структура находится под управлением t emp), плюссмещение в слове, соответствующее пятому биту. Переменная highPriori ty представ­ляет собой копию этого объекта std : : vector<bool > : : reference, так что highPriori t утоже содержит указатель на слово в t emp плюс смещение, соответствующее пятому биту.В конце инструкции объект t emp уничтожается, так как это объект временный.

В резуль­тате переменная h i ghPr i o r i t y содержит висячий указатель, что и дает неопределенноеповедение при вызове processWidget:processWidget (w, highPriority) ; / / Неопределенное поведение '/ / highPriority содержит/ / висячий указатель !Класс s t d : : v e c t o r <boo l > : : r e f e r e n c e является примером прокси-класса (proxyclass), т.е. класса, цель которого - эмуляция и дополнение поведения некоторого дру­гого типа. Прокси-классы применяются для множества разных целей. Например,std: : vector<boo l> : : re ference нужен для того, чтобы создать иллюзию, что operator [ Jкласса s t d : : vecto r<bo o l > возвращает ссылку на бит, а интеллектуальные указателистандартной библиотеки (см. главу 4, "Интеллектуальные указатели") являются прокси­классами, которые добавляют к обычным указателям управление ресурсами.

Полезностьпрокси-классов - давно установленный и не вызывающий сомнения факт. ФактическиSбГnава 2. Объявnение autoшаблон проектирования "Прокси" - один из наиболее давних членов пантеона шабло­нов проектирования программного обеспечения.Одни прокси-классы спроектированы так, чтобы быть очевидными для клиентов.Это, например, такие классы, как s t d : : sha red_pt r и s t d : : u n i que_pt r. Другие прок­си-классы спроектированы для более-менее невидимой работы. Примером такого "не­видимого" прокси-класса является s t d : : vecto r<boo l > : : r e f e rence, как и его собратstd : : Ьi tset : : reference из класса std : : Ьi t se t .В этом же лагере находятся и некоторые классы библиотек С++, применяющих техно­логию, известную как шаблоны в111ражений (expressioп templates).

Такие библиотеки изна­чально разрабатывались для повышения эффективности кода для числовых вычислений.Например, для заданного класса M a t r i x и объектов rnl, rn2, mЗ и rn4 класса Matrix, вы­ражениеMatrix surn=rnl + rn2 + mЗ + m4 ;может быть вычислено более эффективно, если ope rator+ для объектов Mat rix возвра­щает не сам результат, а его прокси-класс. Иначе говоря, oper a t o r+ для двух объектовMatrix должен возвращать объект прокси-класса, такого как Sum<Ma t r i x , Matrix>, а необъект Mat rix. Как и в случае с std : : vecto r <bool > : : reference и bool, должно иметьсянеявное преобразование из прокси-класса в Mat r i x , которое позволит инициализиро­вать surn прокси-объектом, полученным из выражения справа от знака "=': (Тип этогообъекта будет традиционно кодировать все выражение инициализации, т.е.

быть чем-тонаподобие Surn<Surn<Surn<Ma t r i x , Mat ri x > , Mat rix> , Mat r i x > . Определенно, это тип,от которого следует защитить клиентов.)В качестве общего правила "невидимые" прокси-классы не умеют хорошо работатьвместе с auto. Для объектов таких классов зачастую не предусматривается существова­ние более длительное, чем одна инструкция, так что создание переменных таких типов,как правило, нарушает фундаментальные предположения проекта библиотеки. Это спра­ведливо для std : : vector<boo l > : : reference, и мы видели, как нарушение предположе­ний ведет к неопределенному поведению.Следовательно, надо избегать кода следующего вида:auto someVar=выражение с типом"невидимого"прокси-кла с са ;Но как распознать, когда используется прокси-объект? Программное обеспечение, ис­пользующее невидимый прокси, вряд ли станет его рекламировать.

Ведь эти прокси­объекты должны быть невидимыми, по крайней мере концептуально! И если вы обнару­жите их, то действительно ли следует отказываться от auto и массы преимуществ, про­демонстрированных для него в разделе 2. 1 ?Давайте сначала зададимся вопросом, как найти прокси. Хотя "невидимые" прокси­классы спроектированы таким образом, чтобы при повседневном применении "летатьвне досягаемости радара программиста': использующие их библиотеки часто докумен­тируют такое применение. Чем лучше вы знакомы с основными проектными решениями2.2.

Есnи auto выводит нежеnатеnьный тип, испоnьзуйте явно типизированный и ни циаnизатор57используемых вами библиотек, тем менее вероятно, что вы пропустите такой прокси не­замеченным.Там, где документация слишком краткая, на помощь могут прийти заголовочные фай­лы. Возможность сокрытия прокси-объектов в исходном коде достаточно редка. Обыч­но прокси-объекты возвращаются из функций, которые вызываются клиентами, так чтосигнатуры этих функций отражают существование прокси-объектов. Например, вот каквыглядит std : : vector<boo l > : : operator [ ] :namespace std {11 Из стандарта С++template <class Allocator>class vector<bool, Allocator> {puЬl i c :class reference {...};reference operator [ ] ( s i ze_type n ) ;};В предположении, что вы знаете, что operator [ ] у std : : vector<T> обычно возвращаетнеобычный возвращаемый тип у ope r a t o r [ ] в данном случае должен навести васна мысль о применении здесь прокси-класса.

Уделяя повышенное внимание используе­мым интерфейсам, часто можно выявить наличие прокси-классов.На практике многие разработчики обнаруживают применение прокси-классов толькотогда, когда пытаются отследить источник таинственных проблем при компиляции илиотладить никак не проходящий тесты модуль. Независимо от того, как вы его обнару­жили, после того как выясняется, что auto определен как выведенный тип прокси-клас­са вместо "проксифицируемого" типа, решение не требует отказа от auto. Само по себеключевое слово auto проблемой не является.

Проблема в том, что auto выводит не тоттип, который вам нужен. Решение заключается в том, чтобы обеспечить вывод другоготипа. Способ достижения этого заключается в том, что я называю идиомой явной типи­Т&,зации инициализатора.Идиома явной типизации инициализатора включает объявление переменной с ис­пользованием auto, но с приведением инициализирующего выражения к тому типу, ко­торый должен вывести auto.

Например, вот как можно использовать эту идиому, чтобызаставить hi ghPr i o r i t y стать переменной типа bool:auto highPriorityЗдесь=static_cast<Ьool> ( features ( w) [ 5 ] ) ;продолжает, как и ранее, возвращать объект типано приведение изменяет тип выражения на boo l , ко­торый auto затем выводит в качестве типа переменной h i g h P r i o r i t y. Во время вы­полнения программы объект s t d : : vector<boo l > : : refe rence, который возвращаетсявызовом s t d : : vector<boo l > : : ope rator [ ] , преобразуется в значение bool и в качествеf e a t u re s ( w ) [ 5 ]s t d : : vect o r<bool > : : refe rence,58Гnава 2 . Обьявnение autoчасти преобразования выполняется разыменование все еще корректного указателяна std : : vector<boo l > , возвращенного вызовом features.

Это позволяет избежать не­определенного поведения, с которым мы сталкивались ранее. Затем к битам, на которыеуказывает указатель, применяется индексация с индексом 5 и полученное значение типаbool используется для инициализации переменной highPriority.В примере с Ma t rix идиома явно типизированного инициализатора выглядит следу­ющим образом:auto surnstatic cast<Мatrix> (ml + m2 + mЗ + m4) ;_=Применение идиомы не ограничивается инициализаторами, производимыми прокси­классами. Она может быть полезной для того, чтобы подчеркнуть, что вы сознательносоздаете переменную типа, отличного от типа, генерируемого инициализирующим вы­ражением.

Предположим, например, что у вас есть функция для вычисления некоторогозначения отклонения:douЫe calcEpsilon ( ) ; / / Возвращает значение отклоненияОчевидно, что calcEps i l on возвращает значение douЫe, но предположим, что вы знае­те, что для вашего приложения точности float вполне достаточно и для вас существеннаразница в размерах между f loat и douЬl e . Вы можете объявить переменную типа f loatдля хранения результата функции calcEp s i l onfloat ер = calcEpsilon ( ) ; / / Неявное преобразование/ / douЫe -> floatно это вряд ли выражает мысль "я намеренно уменьшаю точность значения, возвращен­ного функцией': Зато это делает идиома явной типизации инициализатора:auto ер = static cast<float> (calcEpsilon ( ) ) ;_Аналогичные рассуждения применяются, если у вас есть выражение с плавающей точкой,которое вы преднамеренно сохраняете как целочисленное значение.

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

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

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

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