Главная » Просмотр файлов » Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)

Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 38

Файл №1004033 Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)) 38 страницаБьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033) страница 382018-10-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Сначала рассмотрим более традиционный способ копирования массива символов: (нг 1еплгй=вгг(еп (О) г 1ог((п( 1=0; 1<=1еплгй; (ь-';) р [11 = о[г1 Это расточительный способ работы. Длину строки с терминальным нулем легко можно определить непосредственно в процессе просмотра символов этой строки. А так получается, что мы читаем строку дважды: первый раз — чтобы определить длину строки, а второй раз для копирования ее символов. Исправляем этот недочет: (пг 1; УогН=О; в[1]! =О> г'+м) р[11 = О[г); р [1)=О; // терминальный нуль Так как р и Π— указатели, то можно избавиться от переменной 1, применяемой лля индексирования: н411е(*О!=О) *Р=*Ф' р+-ь ( //указывает на следующий символ б 2 Обзор операций языка С++ 177 //указывает иа следующий символ // терминальный нуль ) р=о; Поскольку постфиксные инкремент и декремент позволяют нам использовать значение и лишь потом изменить его, можно переписать цикл еше раз: ыййе(*О!=О) 1 *рьь=*аьь; ) р=ог // терминальный нуль Так как значение выражения *рьь = *аль есть *О, то цикл можно записать еще короче: ый(1е( (*рьь=*В+в) ! =О) 1) Здесь равенство выражения *О нулю обнаруживается после того, как мы его копируем в *р и инкрементируем р, так что тем самым копируется и терминальный нуль (отдельное присваивание из предыдущего варианта кода становится ненужным).

Окончательное сокращение кода достигается тем, что отбрасывается пустой блок, а также явное сравнение с нулем ввиду его избыточности. В итоге, мы приходим к первоначальному варианту кода: ыййе (*рьь=-*Оьь) сваг* зггсру(айаг*, сопле снаг*) з //из <з)г/пйй> В более общих случаях можно применить стандартный алгоритм сору (з2.7.2, З)8.6.1). Везде, где только можно, пользуйтесь средствами стандартной библиотеки вместо возни с указателями и байтами. Функции стандартной библиотеки могут быть встраиваемыми 57.1.1) и даже реализовываться с помощью специализированных машинных инструкций.

Поэтому подумайте дважды, прежде чем отдать предпочтение собственному рукотворному коду перед стандартными библиотечными средствами. 6.2.6. Свободная память Время жизни именованных объектов определяется их областью видимости (84.9.4). Однако часто нужны объекты, время жизни которых не зависит от области вилимости, в которой они были созданы. Таковы, например, объекты, с которыми нужно работать после возврата из функции, где они были созданы. Этот тип объектов создается операцией пеье, а их уничтожение выполняется операцией де1еге. Па- Можно ли сказать, что этот код менее читаем, чем предыдущие версии? Только не для опытных С и С++ программистов. А является ли он более эффективным? Не обязательно (если, конечно, не рассматривать версию с вызовом функции зМеп () для отдельного вычисления длины строки). Эффективность в сильной степени будет зависеть от архитектуры компьютера и особенностей конкретного компилятора.

Самый эффективный способ копирования строк с терминальным нулем на вашей машине должна обеспечивать соответствующая стандартная библиотечная функция: 178 Глава б. Выражения и операторы яи ос! Еподе ( Тойеп ча?ие орет Еподе*!е?1) Еподе* г?еЬ?; // ... )' Еподе* ехрг (Ьоо? лег) ( Еподе* !е)?=!егт (де!) / уьг(;; ) знйсЬ (сиге !оЬ) ( сазе РЗЛ)Б: саяе М1)ч'1/Я: ( Еноте* и = пея Еподе! и- >прес=сиге гоЬ; и — >1е?1=1е/?; и->г!ЬЬ?=!ест (пие); ?еТ?=и; Ьгеай) ) ИеГаи?1: ге!и~ и 1еуг! // создат~ Еподе в свободной памяти // вернуть узел Генератор кода использует построенные узлы дерева, а затем удаляет их; чо?д еепега?е (Еподе* и ) ( зпйсЬ (п->орег) ( саяе РЕСБ: // ...

Ие?е!е п; //удалить Еподе из свободной памяти Объект, созданный операцией пев, существует до тек пор, пока он не будет явным образом уничтожен операцией Ие1е!е. Только после этого память, занимаемая обьектом, освобождается и может далее снова использоваться операциями пе?ч. Обычно реализации С++ не гарантируют автоматического освобождения памяти мять под эти объекты выделяется из так называемой «свободной памяти» (или из «кучи»; динамической памяти).

Посмотрим, как можно написать компилятор в стиле, который мы применили для написания программы-калькулятора 66.)). Функции синтаксического анализа могли бы строить дерево выражений для его дальнейшего использования генератором кода: 6.2. Обзор операций языка С-ь+ 179 6.2.6.1. Массивы Массивы объектов также можно создавать операцией пеп, Например; сйаг' вате вгт(пя (сопят сйаг* р) ( сйат" в=ив»т айат [втт(еи (р) «1]; в(геру (в, р); ге(ига ю ) тт скопировать из р в 5 (пг та(п ()пг атас, сйаг* агат [1 ) ( (Т( яс < г) 11(1); сйаг* р = вате вгггп» (агат [1] ); У... ае!ете[] р; ) Операция в(е!еге применяется для удаления одиночных объектов; ае!ете [ ] используется для удаления массивов.

Чтобы корректно освободить память, выделенную операцией пеи„операции ае!еге и ае!ете ( ] должны знать размер удаляемого объекта. Отсюда следует, что размер памяти, динамически выделяемой под объект стандартной реализацией операции иеп, несколько больше размера памяти, отводимого под статический объект. В типичном случае используется одно дополнительное слово для хранения размера объекта. Так как объекты типа тесгог (93.7.1, 916.3) ничем не хуже иных объектов, то их, естественно, можно динамически размешать в памяти операцией иеп и удалять оттуда (уничтожать) операцией ае!ете.

Вот пример на эту тему: тоЫ Г(1пс п) ( тес(от<!не>* р = пеп гесгот<тг> (п); !ит* (( = иеи 1ит (п]; ~7 ... йе1еге р; ае1ете [ ] а ) ) тт индивидуал~ный обьект ~У массив Применять операцию в(е!еге (1 можно лишь к указателям на массивы, значения которых или установлены операцией пеп, или равны нулю. Если ае!ете ( ] применяется к нулю, то не производится никаких действий.

(«сборки мусора») с тем, чтобы их снова могли использовать операции иеи. Поэтому я полагаю, что объекты, созданные операцией пеи, удаляются вручную операцией ае!еге. Лишь в случае наличия в конкретной реализации С++ автоматического сборщика мусора можно обойтись без операций с(е!еге 5С.9.1). Применять операцию йе!еге можно лишь к указателям, значения которых или установлены операцией иеи, или равны нулю. Если ае!еге применяется к нулю, то не производится никаких действий. Более специализированные версии операции пеп обсуждаются в 915.6.

1ВО Глава б. Выражения и операторы 6.2.6.2. Исчерпание памяти Реализации операций пею, <(е1е<е, пеи [] и'<<е1е<е (] используют следующие стандартные функции, прототипы которых представлены в заголовочном файле <пею> ((э]9.4.5): гоЫ» орега<ог пею (в<<в Ю < гоЫ* орега<ог Ие!е<е(гоЫ» р); УУ выделяет память для индивидуального обьекта ,Упри р! =О освобождает выделенную операцией У лею память го<0* орега<ог пею [] (вЫе <) < У выделяет память лод массив гоЫ" орега<ог <<е!е<е [] (гоЫ* р) < УУ при р! =О освобождает выделенную операцией УУ пеирл память Когда операции пею требуется вьщелить память под некоторый объект, вызывается функция орегаюг пею(), которая и вьщеляет нужное колИчество байт.

Аналогично, когда операции пею [] требуется выделить память под массив, вызывается функция орега<ог пею[] () . Стандартные реализации функций орега<огпею() и орега<огпею[] () не инициализируют выделяемую ими память.

Что произойдет, когда операции пею не удастся найти в свободной памяти блок затребованного размера? По умолчанию в этом случае генерируется исключение Ьа<1 а!!ос (другие варианты смотри в В]9.4.5). Например: гой! 1() ( <гу ( 1ог(<; ) пею сйаг[!0000] < со<ей (Ьа« адов) ( сегг " "Метогу ехйаив<е<<!»п" < гоЫ ои< оу' в<оке ( ) сегг« "орега<ог нею!а<!е«< ои< о)' в<иге',и" < <йгои Ьа<( апас(); ) Ы< та!п () ( ве< пею йап«!ег (ои< оу' в<оге); У делаем ои< и!' <гоге обработчиком нехватки памяти Какова бы ни была память на вашей машине, здесь рано или поздно сработает обработчик исключения Ьа<1 а!!ос.

У нас есть возможность явно указать, что должно происходить при исчерпании памяти операцией пею, так как в этот момент операция пеяг вызывает функцию, зарегистрированную с помощью стандартной функции ве< пою йап<[1ег() (ее прототип дан в заголовочном файле <иею>), если, конечно, такая регистрация вообще имела место. Например: 6.2 Обзор операций языка С-ь+ 181 )ог(;)) пен сйаг[100001 з сонг«" доне~и"; Эта программа выведет строку орегагог пем [а11ед: ои! оГмоге В 5[4.4.5 приведена правдоподобная реализация функции орегагог нем (), которая проверяет наличие зарегистрированного обработчика и генерирует исключение йЫ а11ос в случае отсутствия такового. Зарегистрированный обработчик может делать что-нибудь более умное, чем просто завершение программы. Например, обработчик может все же попытаться отыскать память, запрошенную операцией пем, реализовав некоторый вариант сборки мусора (операция де!еге станет в таком случае ненужной).

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

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

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

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