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

Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 209

Файл №1160791 Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004) 209 страницаБ. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791) страница 2092019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Первая размерность массива не влияет на проблему нахождения местоположения элемента; она просто говорит о том, сколько присутствует элементов (в данном случае 3) соответствуюшсго типа (здесь !ау[5]). Например, взглянув на прелыдушее представление та, мы заметим, что зная только вторую размерность 5 мы можем найти местоположение та[1][5] для любого !. Поэтому первую размерность можно передать в качестве аргумента: ооиургупг пиб [уп1 т[][зу,чп1 йт1) ( уог (т1 ! = 0;1<йт1; й-~) ( /ог (!пуу = О;1<5, 1««) сои!«т[!)[!) «'ч,»; сои1 « "чп'; Приложение В. Технические подробности 916 Во-первых, объявление т[][] незаконно, так как чтобы найти элемент, должна быть известна вторая размерность двухмерного массива. Во-вторых, выражение т[!][(1 интерпретируется (правильно) как * (* (т+!)+!), хотя ато вряд ли то, чего хотел про- граммист.

Правильное решение таково: иаи1рпп! т!!'(ш!'т,ш!й1т1,!п!й!т2) ( 1аг (ш! 1= О; !кй!т1; Н+) ( )аг (!п!1 = О; !кй!т2; 1ж~) сои ! «т[!"й!т 2ч.!] « ' с!'; сои! « '1,п'; у)не слтикол ясно Выражение для доступа к членам в рпи! т!1'() эквивалентно тому, что компилятор генерирует, когда ему известна последняя размерность. Чтобы вызвать эту функцию, мы передаем матрицу как обычный указатель: !и! таш () ( сп! с[3][5] = ((0,1,2,3,4), (1О, 11, 12, 13, 14), (20,21,22,23,24) ); рг!п! т35 (и) рг!и! пи5 (и,3); рпп! т!!'(йи[О)(О],3, 51, Обратите внимание на использование 3,и[0) [О) в последнем вы вове; сработало бы и о[0], так как это равносильно, но и будет ошибкой типа. Такой тонкий и довольно запутанный код лучше всего прятать.

Если вам нужно работать напрямую с многомерными массивами, подумайте, как инкапсулировать соответствующий код, использующий их. Таким образом вы облегчите работу с вашей программой следу!ощему программисту. Введение типа многомерного массива с соответствующим оператором индексации избавит многих пользователей от забот о расположении данных в массиве (9 22А.6). Стандартный пес!Ог(9 16.3) этими проблемами не страдает. В.8. Экономия памяти При написании нетривиальных программ часто наступает время, когда вам требуется памяти больше, чем имеется или чем это приемлемо.

Есть два способа явыжиманияь дополнительной памяти из имеющейся; [1) Помещать в один байт несколько маленьких объектов. [2] В разное время использовать одну и ту же область памяти для хранения разных объектов. Первое достигается использованием битовых полей ()!еЫ), а последнее — обьединений (иисои). Этн конструкции описываются в последующих разделах. Многие применения полей и объединений являются чистой оптимизацией, которые часто основываются на непереносимых способах распределения памяти.

Поэтому прежде чем нх применять, программисту следует хорошенько подумать. Часто лучшим под; 917 В.8. Экономия памяти ходом является изменение способа управления данными — например, больше при- менять динамическое распределение памяти Я 6.2.6) и мсныпе пользоваться заранее распределяемой (статической) памятью. В.8.1. Поля //с(зизический номер страницы для й6000 // номер страничного кадра // не используются //алгоритм согзасоеания с кзш-паллятью заисгРРХ ( ипз!унес( !и! РГМ: 22 спг: д; ипз!улес! т! ССА: з, Ьоо( полгеасйа61е: 1; 6оо1 с(!ггу: 1; Ьоо1эа(Ы:1; Ьоо! у!оЬа1: 1; Этот пример также иллюстрирует другое важное применение полей; именование частей внешне заданного размещения в памяти.

Поле должно о~носиться к интегральному или псречислимому типу (9 4.1.1). Для поля нельзя получить адрес. Однако в остальном полем можно пользоваться то~зло так же, как другими переменными. Отметим, что поле Ьоо1 на самом деле может быть представлено одним битом. В ядре операционной системы или отладчиках тип РРХ можно применить следующим образом: эо!с(раг! о/ (гМ зуз!ет (РРН* р) ( //.- Д'(р->с!!г!у) ( //содержиллое излшнилось // колирозанне на диск р->л!!г!у = 0; //...

) Как это ни удивительно, использование полей для упаковки нескольких переменных в один байт не обязательно экономит память. Этим уменьшается область данных, но размер кода, манипулирующего такими переменными, на большинстве машин возрастает. Известно, что когда бинарные переменные преобразуются из битовых полей в символы, программы значительно сжимаются! Кроме того, обращение к айаг и !и! намного быстрее, чем к полю. Поля — это просто удобное средство для битовых логических операторов (9 6.2А), чтобы извлекать информацию из части слова и помещать ее туда.

Для представления бинарной переменной — например, для указания положения выключателя включен/выключен —. представляется странным использовать целый байт (или сйаг или Ьоо1), но айаг в С++ — это самый маленький объект, под который можно выделить память, и который можно независимо адресовать 8 5.1). Однако несколько таких крохотных переменных можно связать вместе как поля в структуре. Член определяется как поле указанием количества битов, которые оно занимает.

Допускаются неименованные поля. Они не влияют на смысл именованных полей, но ими можно пользоваться, чтобы лучше расположить данные в машинной памяти (зависимым от машины образом): Приложение В. Технические подробности 918 В.8.2. Объединения Объединение (ип1оп) — это структура (з1гис1), в которой все члены расположены по одному и тому же адресу, так что все объединение занимает столько места, сколько занимает самый большой его член. Естественно, в данный момент времени объсдинение может хранить значение только одного из членов. Например, рассмотрим запись в таблице символов, содержащую имя и значение: епит Туре ( 5, 1 ); з1гис1Еп1гу) сйаг* пате; Туре 1; сйаг" з; 1п11; // используем з, если 1 == 5 //используем б если1==1 ооЫ/)Епггу* р) )Т )р->1== 5) сои1«р — >з; //- ) Членами з и 1 нельзя пользоваться одновременно, так что место под них.тратится впустую.

Этого можно просто избежать, описав обе переменные так, чтобы они стали членами объединения; ит'оп )га1ие ( сиаг' з; 1п1 б зитяс1 Еп1гу 1 спас" пате, Туре 1, )га1ие о; // используем о.з, если 1==5; // используем ол, если1 ==1 ооЫ/(Епггу* р) ( )Т )р — >1== 5) сои1«р — о.з; //- ) К сожалению, введение объединения вынуждаст нас переписать код, чтобы заменить простое з на и.з. Этого можно избежать при помощи анонимного обьединения — объеди- нения, которое не имеет имени и с.,тедовательно нс определяет типа.

Вместо этого оно просто гарантирует, что все его члены располагаются по одному и тому же адресу: з1гис1 Епггу ) сАа~ * пате; Язык не следит за тем, значения какого вида хранятся в объединении, так что про- граммист должен по-прежнему писать так: 919 В.8. Экономия памяти Туре 1; ип(оп ( с)ьаг' в; 1пт 1; ); //используем К если 1== 5 //используем 0 если1==1 ооШ/(Епегу«р( ( (/(р- 1==9(соиГ«р«>в; // .. ипгоп Гас(де ( //вздор( (пГ 1; (пг*р; //жульничество гп1* с1~еаг(1п11) ( Гирде а; ау= б гегигп а.р; // плохо На самом деле это никакое не преобразование. На некоторых машинах 1п1и 1пр занимают разный объем памяти, а на других (п1 не может иметь нечетный адрес, Такое применение объединений опасно и непереносимо, а для преобразования типов сеть явный и переносимый способ (9 6,2.7).

Иногда объединения преднамеренно использукьтся для того, чтобы избежать преобразовання типов. Наьгример, Гиг(уе можно использовать для того, чтобы определить представление нулевого указателя: (пг та(п (( ( Гиь(де/оо; 1оо.р = О; сои1 « 'целое зпачевие указателя О равно ' «уоо(« 'п'; Так весь код, использующий Еп1гу, останется без изменений. Применение объединения таким образом, что его значение всегда читается при помощи члена, через который он был записан — это чистая оптимизация.

Однако не всегда легко гарантировать, что объединение используется только таким образом, и из-за этого могут возникать тонкие ошибки. Чтобы их избежать, объединение можно ицкапсулировать, чтобы гарантировалось соответствие между полем типа и доступом к членам объединения Я 10.6120]). Иногда объединения ошибочно используют для «преобразования типов». Такое главным образом практикуют программисты, работавшие с языками, не умеющими преобразовывать типы явно, и в которых приходится хитрить.

Следующий пример демонстрирует, как (п1 «преобразуется»'в (п1*, просто исходя из побитовой эквивалентности: 920 Приложение В. Технические подробности В.8.3. Объединения и классы Многие нетривиальные объединения имеют некоторые члены, которые значительно больше, чем часто используемые члены.

Поскольку размеры объединения по крайней мере равны размерам наибольшего члена, память расходуется зря, Часто этого можно избежать, пользуясь вместо объединений производными классами. Класс с конструктором, деструктором или операцией копирования не может быть типом члена объединения Я 10А.12), так как компилятор не может узнать, какой член уничтожать. В.9. Управление памятью В С++ есть три основных способа использования памяти: Статическая помять, в которую компоновщик помещает объект на все время выполнения программы.

В статической памяти располагаются глобальные переменные и переменные из пространств имен, статические члены классов Я 10.2А) и статические переменные из функций (б 7.1,2). Объект, размещаемый в статической памяти, конструируется один раз и сохраняется до окончания программы. Он всегда имеет один и тот же адрес. Статические объекты могут вызвать проблемы в программах, использующих потоки (при параллелизме с разделяемым адресным пространством), поскольку такие объекты используются совместно и для правильного доступа к ним требуется блокировка. Ав>пол>атичесчпя пал>ягпь, в которой располагаются аргументы функций и локальные переменные.

Каждый блок или функция получает свою копию. Такая память автоматически создается и уничтожается, отсюда и название — автоматическая память. Ее также называют «памятью в стеке». Если вы хотите соблюсти абсолютную ясность, С++ предоставляет необязательное ключевое слово аи(о. Свободная память, которую явно требует программа при размещении объектов, н которую она может освободить после того, как память больше не нужна (при помощи пеш и п>е1еТе). Когда программе требуется егце свободной памяти, пеш запрашивает ее у операционной системы. Как правило, свободная память (также называемая динаиической памя>пью пли кучей) за время жизни программы разрастается, поскольку память никогда не возвращается операционной системе для использования другими программами.

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

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

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

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

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