C++: библиотека программиста



Download 1,95 Mb.
Pdf ko'rish
bet128/144
Sana24.02.2022
Hajmi1,95 Mb.
#223123
TuriРеферат
1   ...   124   125   126   127   128   129   130   131   ...   144
Bog'liq
C -Eldjer-Djeff-for-Real-Programmers-RUS-www.itlibitum.ru

 
231 

active = &A; 
inactive 

&B; 

active->Reinitialize(); 
// 
Перебрать все VoidPtr и найте активные объекты 
VoidPtrIterator* iterator = VoidPtr::pool->iterator(); 
while 
(iterator->More()) 

VoidPtr* vp = iterator->Next(); 
if (vp->address >= inactive && 
vp->address < inactive + sizeof(*inactive)) 

void* 
new_space 

active->Allocate(vp->size); 
if (new_space == NULL) 
// Исключение – нехватка памяти 
memcpy(new_space, 
vp->address, 
vp->size); 
vp->address 

new_space; 


delete 
iterator; 

Все существенное происходит в цикле 
while
функции 
Space::Swap()
. Каждый объект в 
предыдущей, ранее активной половине копируется в новую активную половину. Вскоре вы поймете, 
зачем мы проверяем, принадлежит ли адрес старой половине. 
Оператор new 
Конечно, у нас появляется перегруженный оператор 
new
, который использует эту структуру. 
void* operator new(size_t size, Space* space) 

return 
space->Allocate(size); 

Ведущие указатели 
Наконец, ведущие указатели должны использовать это пространство при создании объектов. 
template  
class BMP : public VoidPtr { 
private: // Запретить копирование и присваивание указателей 
BMP(const MP&) {} 
BMP& operator=(const BMP&) { return *this; } 
public: 
BMP() : VoidPtr(new(object_space) Type, sizeof(Type)) {} 
virtual ~BMP() { ((Type*)address->Type::~Type(); } 
Type* operator->() { return (Type*)address; } 
}; 
Здесь 
object_space
— глобальная переменная (а может быть, статическая переменная класса 
VoidPtr
), которая ссылается на рабочее пространство 
Space



 232 
Последовательное копирование 
Функция 
Swap()
вызывается в произвольные моменты и, скорее всего, будет работать в течение 
некоторого времени. В работе программы возникают непредсказуемые затяжки, а это бесит 
пользователей едва ли не больше, чем аппаратные сбои. К счастью, алгоритм Бейкера легко 
модифицировать, чтобы копирование выполнялось поэтапно в фоновом режиме. 
На мосту Бей-Бридж в Сан-Франциско постоянно работает бригада маляров. Она начинает красить 
мост с одного конца и через пару лет успешно докрашивает до другого. К этому времени можно 
начинать красить заново, в другую сторону. Работа идет постоянно, не считая редких перерывов из-за 
землетрясений или демонстраций протеста. В сущности, именно так алгоритм Бейкера превращается в 
схему последовательного уплотнения. 
Начинаем следующий заход на класс 
Space
. Функция 
Swap()
делится на две части, одна из которых 
переключает активные половины, а другая многократно вызывается и при каждом вызове копирует по 
одному объекту. 
class Space { 
private: 
VoidPtrIterator* 
iterator; // 
Информация о копировании 
HalfSpace A, B; 
HalfSpace* 
active; 
HalfSpace* 
inactive; 
void 
Swap(); 
// 
Переключить активную половину, скопировать объекты 
public: 
Space() : active(&A), inactive(&B), iterator(NULL) { Swap(); } 
void* 
Allocate(size_t 
size); 
void 
Copy1(); 
}; 
void* Space::Allocate(size_t size) 

void* space = active->Allocate(size); 
if (space != NULL) 
// 
Исключение – нехватка памяти 
return 
space; 

void Space::Swap() 

if (active == &A) 

active = &B; 
inactive 

&A; 

else 

active = &A; 
inactive 

&B; 

active->Reinitialize(); 
delete 
iterator; 
iterator 

VoidPtr::pool->iterator(); 

void Space::Copy1() 



Download 1,95 Mb.

Do'stlaringiz bilan baham:
1   ...   124   125   126   127   128   129   130   131   ...   144




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish