Искусство программирования на Си (984073), страница 26
Текст из файла (страница 26)
ели этот аргумент убедил вас, значит, вы профессор пребывает в отвратительном расположении Нс запрашиваем ли мы объем памяти, превосходяший ~Щ „ унран~нняенакянтнш ИФЕВФ Пернсиншреннннязнл С Глава В Часть 1 Листинг 8.4. Восстановление работы после сбоя файла может быть определен заранее (возможно, с ис- Использование дискового пространства геа((ос. пользованием таких зависящих от реюшзации расшире- ных выше стратегий приведет к том>, что ь атегий п иведсз к том>, что вы никогда ний. как Гт)е)евв(Ь(), которые имеются во многих хоро- У вас есть возможность использовать лругие виды запо- не потеряете данные из-за ограничений памяти. яеаеьс сЬаг *Ьвсгег = ВОЬГН минаюших устройств в качестве дополнения к основной веааьс аьяе Г вага)ге = О; шо известных компиляторах).
то программа может ягге Е 1ел = яег1еп(я) + 1; вьшсдить н>жное количество бантов, считать исходный Успешное выполнение функции саПос используют такую виртртмьнрю питтять. При недостатфайл в этот буфер и записать его из этого буфера. ПронМ1е(1ел > Ьвся)яе) ке ВАМ они находят некоторую область памяти, кото- функт)ия са)(ос, как я привык считать, изумительна. сто н быстро. Если это не получается, ие беда.
Програм( рая кажется гте1сужной в этот мометгг и записывают ее на 0на не только выделяет память удобными прямоугольма не должна полагаться на динамический буФер. р = геа11ос(Ьвггег, Ьцсв(ае ' 2); диск, создавая свободное просгрансзво для вашего заиро- ными блоками, приголными лля массивов, но и нници- 11(р 1= ВВЬЬ) В самом худшем случае она может работать с буфером, са. Если ваша операционная система делает это, мжтове- ализир>ст все элементы этих массивов со значением ( состоящим только из олного байта. Кроме того, она ятно, что вы столкнетесь с отказом при динамическом Ьв(в1яе *= 2; почти наверняка может использовать маленький авто- роятно, Ьасгег = р; .ф, .. выделении памяги, разве что ваша программа слишком Я имел именно такое представление об этои функматический буфер — массив типа вяя)влет) сьаг требовательна или ошибка столь велика, по разрушает ции.
Но оно было неправильным, по крайней мсрс, в Я нелавно написгю программу, которая обрабатывает е1ве подсистему выделения памяти в приложении. отношении >казанных аспектов повеления ф>нкции текстовые файлы, проводя эдсмснтарные "поиск и засалос Взять хотя бы мое см>тиос представление о пер = геа11ос(Ьа(сег, 1еп); мену". Мне был нужен большой буфер, но, если нуж- НАГРУЖАЕМ )))Лй)00))У5 Ес(р 1= воьь) но. я люг проделывать операции и с буфепом меньшего коси "п ямо>гольной" памяти, которос появилось у ко'да паРУ Ле™~'~д Я 'е тировап не о'оРУ протра од в.
иянисм лвух аргумс ов ф>нкции салос размера. Я опрсделия маленький бу<(тср и величину му управления памятью, я заставил Утчпс)оттз МТ выделить Ьагььге = 1еа; * (длины и ширшты, так сказать). Но я упоминаю здесь об сЬаг*. Я пытался динамически заказать В Кб памяти. мне 1,5 Гб памяти, используя множество сравнительно Ьвтсег = р; н , ; , б ения их этохт только потому, что встречал некоторых людей, Если это не получалось, попытка повторялась для вдвое небольших выделении в цикле.
Время освобождения их это т о. >, р ' р Перееиотреиеии езяе С Зврооиии оаиетио $)ф$яя Часть! Гяава 8 заться огромным неудобством. Заметим. однако, что Отслеживание памяти заключадось в записывании Как бы там нп было, я проделал необходимую ра- ловочные файлы для этих макросов, поскольку иначе нетрудно найти рациональный способ за счет дополни- информации о выделении памяти в бинарное дерево боту и прелставзяю вам исправленный исходньш кол. они б>л>т конфликтовать с вызовами стандартных бибтельного экземпляра вашей структуры: вместе с информацией Г1ЕЕ и Е1ХЕ . В качестве Библиотека включает в себя заголовочный файл лиотечных функций ша1!ос и т.п.
в самих исходных первичной информашш я сохранял собственно указа- (шещ(гасй.й) и файл с исходным колом (шеш(гасй.с). кодах контроля памяти Более того, эти имена макро- РОО *рг тель и использовал его как ключ. Файл шещ(гасй.с прслставляет собой простую >правда- сов б>д>т конфликтовать с прототипами в <я(е)ИЬ.Ь>, Я не принял во внимание, что при запросе операци- ющую програмлеу.
Показывая, как контролировать па- по может вызвать самые различные осложнения. Пор = аа11ос(в * аьаеоу 'р); онная система начинала выделение памяти с низших мять, я, кроме того, буду все время обращать ваше вни- этому я использовал др>тие имена. Я решил назвать макзуе )= ввьь) (р = ! адресов, увеличивая возвращаемый адрес на некоторую мание на мои ошибки (н исправление их), частично, росы хшаПос, хгеа11ос и т.п. Поскольку:пи имена уже ( величину при каждол~ новом выделении.
В результате чтобы вас позабавить. но в основном в надежде на то, достаточно популярны как нсофициальныс расширср(х) мое бинарное дерево стало выглядеть скорее как унар- что вы, мои благосклонный читатель, извлсчстс пользу нпя, я решил использовать описательные имена с ис) ный телеграфный столб — наиболее дорогостоящая из моих ошибок и нс сделаете таких же свми.
пользованием букв верхнего и нижнего регистров. В симуляция сортированного списка. Зффективносзь ра- этом случае маловероятен конфликт с нлеснамн >же Мы обычно предпочитаем, чтобы те функции, коботы програхемы резко снизилась. Заголовочный файл для осуществления существ>юшил популярных функции. торые выполняет этот код, выполняла функция са))ос.
В этом кодс приносится в жертву эФфективность ради Чтобы справиться с проблемой низкой эффективноРхгдвс Идитядех сти, я применил ко всему набору ф>нкций условную ясности и краткости. Если вы хотите сжать код вплоть В листинге 8.5 описывается интерфейс компиляцию. Они буд>ч вкзючены в про~рамму, толь- )ееуьве А11асиеаогу ( атее) до самого последнего байта, то, вероятно, предпочтете ко когда я этого захочу. В противном случае использу- Веьивх11осиеаогу(в(ге, Р118 , Ь1ВЕ ) использовать вместо этого обычныи метод. Р"- У -' Листинг 8.5.
Заголовочный файл дпя ются более простые функции окончательного кода. Таосуществления контроля над памятью. )де(эае Х11осеоруасг1вя(а) Пересмо Ееяяый языя С 6П- г Часть ) Уяраюяяие яаееяыя Глава 8 %ИМ пользователем. У меня были сложносзи с парой особен- можем преобразовать указатель в целую величину (воз- Для сохранения ключа необходима память. Так по- йгелаег тхв Рдхьодо но неясных определяемых пользователем типов, когда можно, через массив ввмйпед сйаг) и сохранить се в лучастся, однако, что нам нужен новый ключ именно я участвовал в корпоративных разработках.) Существу- качестве ключа.
Но мы нс можем гарантировать то~о, что тогда, когда мы все равно запрашиваем память. ПоэтоЕуредег вьгесе Ратьпао ст один способ, позволякяции обойти проблему, кото- пользовательская программа вернет тот же битовый на- му все, что необходимо сделать, — это заказать нсбольр>ю могло удачно решить применение й)1п)уредеГ, если бор для освобожления указателя, который мы переда- шой объем дополнительной памяти, в которую и запи- чоьд *Рггу бы такой оператор только существовал: включение за- ли сразу после выделения памяти. сать значение ключа для данного распределения памяти.
егге Е агав; щиты в стиле заголовочного файла вокруг каждого И мы не можем пожать плечами и заявить, что не Однако для нашего кода вызова будет не слишком сваг *Р11енаве. Гуредеу, К сожалению, исправлять все наши определе- собираемся беспокоиться о поддержании любых плат- удобно пропускать старый ключ при использовании 1ее Ыаевевьег; ния гуредеГ таким способом слишком дорого. И хотя я форм с нелинейной адресацией.
Это книга о С, а не о динамически вьщеленной памяти, особенно если это начал это делать, достаточно очевидно, что это не вой- С для гггагафаряг с линейной адресацией! Поэтому мы дол- еше зависит от того, определен ли МЕМТВАСК. Воз- )гелаьг дст у вас в привычку. Тем нс менее, я оставил охран- жны найти лучшес решение. вращаемый нами указатель должен указывать область Для нас было бы достаточно удобно, если бы чтоныи код на месте на тот случай, если это покажется вам Хорошо, сели нет возможности подходящим обра- памяти, расположенную сразу за дополнительно заре- либо из этой информации можно было использовать в хорошей идеей и вы захотите сс использовать. Если это зом сравнивать указатели, нельзя ли вместо этого срав- зервированной для ключа областью.
Но какой объем качестве уникального ключа. Однако это исключено. не так, просзо забудьте о ней. нивать что-нибудь другое? Что. сели мы присвоим уни- памяти мы должны отвести для ключа? Зависит ли это Мы уже выясняли, почему нс подходит наиболсс мноСеичас мы переходим кочсныгзжномутипуАЕ1С)Ч. кальнос значение каждому выделению памяти и от того, сколько запросов памяти мы будем делать? гообсшающий кандидат чо)д ЯРтг. Но можно рассмотПосчотритс сначала на код, а затем я объясню. используем эту величину как ключ дерева! Это может показаться странным, но размер клоча нс реть и другие варианты.