ПредишенСледващото


Често при създаването на сложни приложения, изискващи висока скорост, е необходимо за нетривиален подходи към решаването на различни проблеми, които обикновено се решават просто, но ефективно. Един такъв проблем може да бъде необходимо да се предоставят много памет блокове от един и същ размер в реално време. Тези единици могат да бъдат единици в стратегията, елементи от списъка, и др. Вградена памет мениджър се справя с тази задача, но той не го "знаят", че всички наши блокове от един и същ размер и не означава нищо за техния брой. Нека се опитаме да замени стандартния мениджър на своята, специализирана, изградена въз основа на посочените по-горе разпоредби, а именно - на познаването на размера на блока и приблизителното количество.

Всяка управление на паметта работи две понятия - множество избрани (заети) блокове и множество свободни блокове. Във всяка една универсална програма за управление на свободен блок е с размер, който зависи от много фактори, независими от управителя, като процедурата за извличане / изтриване на блокове и други подобни. Но всички ние просто - размерите му са едни и същи и не е необходимо да се блокира търсене до желания размер. Ние се въведе понятието блок-листа. Отправете следната структура:

Сега Следваща показалка заема четири байта, така че минималната сума на окупираните от единица ще бъде равна на четири. Все пак, това не ни пречи да се разпределят по-малки блокове. Отделно от него в рамките на структурата съдържа самия елемент, той е и самият обект, за който ние се разпределят. Комбинирането съюз ни дава точното подреждане на полетата на тази структура, а именно - Полета следващия елемент и да се припокриват един с друг, което е в този случай един вид "трик", тъй като не можем да използваме една от тези области, без смесването на другия. Но, както ще се види, всяко от полетата, използвани в различни времена и не пречи един с друг.

Ние ще запазим всичко, което се пише за в специален клас, който ще се занимава с разпределение на паметта.

Въпреки това, когато то ще бъде запазено блокове myMemBlock структура? Нанесете малко трик - ние ще ги съхранява в масив. За тази динамично разпределяне на масив от N елемента, и ще ги използва като ресурс на разположение блокове памет. Централен структура за един от тези масиви.

В тази структура имаме набор от наличните елементи и указател към следващия структура, тъй като можем да разпространявате изисква повече от N елемента.

MyManager клас добиват следната форма.

Сега е времето да се напише една от най-важните функции - изолация единица. Тъй като изборът ще се проведе? Да започнем с това, ние проверите наличието на елементи в списък FreeBlocks, и ако има такива, просто да даде на първия елемент от списъка и го отстранят. При липса на свободни елементи, заделяме следващия елемент в списъка форма Масивите myBigArray структура и влиза всички новосъздадени елементи Array масив [N] в списъка на свободните блокове. След това, ние получаваме първоначалното състояние за първия случай.

Друга особеност, която е необходима за нормалната работа на управителя на паметта, ще бъдат описани по-долу. Необходимо е не само да се разпределят на блоковете, но и да ги освободи.

С пускането на предварително определен блок, ние просто ще го напиша в списъка с наличните елементи, като го поставите в началото. Интересна особеност - за да можем да "освободи" устройството не се разпределят по-рано от нашия мениджър! И тя ще работи правилно за блокове най-малко четири байта. Все пак, това не е правилно от гледна точка на доброто програмиране стил.

Така че, следващото издание на myManager клас.

Фигурата показва местоположението на обекта в случай на N = 6 и броят на масиви равна на четири. Цвят на светлината разпределени безплатни блокове и тъмно - заети.

Всички светлина (не заети) блокове са в списък FreeBlocks и тъмно на разположение на приложение, което работи с нашия мениджър. С пускането на блока, тя се поставя в списък FreeBlocks и става достъпна за по-нататъшното разпределение.

След това трябваше да отида пак на "трик" - във вътрешността на Free функция е указател към блок уволнен от тип Т, докато ние имаме блокове от типа myMemBlock. Така че трябва да се даде изрично видове, като се има предвид, че типът T всъщност се поберат в myMemBlock, а ние ликвидация тип myMemBlock тя да приложи този "трик".

В деструктора на класа myManager премахва първия елемент в списъка с масив, и те са всеки от тяхното потомство (вж. MyBigArray клас деструктор) е отстранен от своя страна. Нашият мениджър като цяло ще се увеличи броят на масиви все още не е установен един вид средна позиция, в зависимост от характеристиките на средата, в която той ще работи.

Ако конкретното приложение, така че голям брой елементи за подбор и с прекъсвания се случва рядко, то е възможно да се направи функцията Свободен на броя на използваните блокове във всеки масив и премахване на целия масив на сигурно, че тя не съдържа разпределени единици. Въпреки това, той няма смисъл да се занимава с такива неща, тъй като това ще усложни и забави, когато съмнителна полза.

Скоростта и ефективността на работата на мениджъра зависи от конкретното приложение. стойност N може да бъде избран така, че да осигури добри характеристики, включително поддържане на икономичен размера на паметта. Струва си да се помни, че при създаването на редовен масив, там е доста дълъг цикъл въвеждане на нови елементи в списъка, което изисква време. Ускоряване на работата може да се постигне чрез установяване на точното или приблизителния брой на блокове, които могат едновременно да се разпространява и да зададете съответната стойност на постоянното N. Когато се появи "стоят" разходите на процеса за отпускане на нов член просто ще оскъдна.

С помощта на мениджъра е както следва. Създаване на глобален обект за всеки от класовете на елементи и да напишете прост макрос. Например:

Свързани статии

Подкрепете проекта - споделете линка, благодаря!