Сборна памет

39 отговора 0 прегледа
#1

Сборна памет

 class A{

public:
static void *operator new(size_t size);
static void operator delete(void *obj, size_t size);
...
private:
union {
ARepresentation *prep;
A *pnext;
}
static const int BLOCK_SIZE;
static A *pFreeListHead;
};

void* A::new(size_t size){
if(size !=sizeof(A))
return ::operator new(size);
A* p = pFreeListHead;
if(p)
pFreeListHead = pFreeListHead->pnext;
else{
A* pBlock = static_cast<A*>(::operator new(BLOCK_SIZE*sizeof(A)));
for(int i = 1; i < BLOCK_SIZE-1; ++i){
pBlock.pnext = &pBlock[i+1];
}
pBlock[BLOCK_SIZE-1].pnext = NULL;
p = pBlock;
pFreeListHead = &pBlock[1];
}
return p;
}

void A::operator delete(void *obj, size_t size){
if(!obj)
return;
A* p = static_cast<A*>(obj);
p->pnext = pFreeListHead;
pFreeListHead = p;
}

Течка или сборна памет(никога не надвишава максималния размер, зададен при създаването й)? Според мен си е чиста течка.

Редактирано от Om_ на

Отговор
в отговор на Om_ #2

Re: Сборна памет

Какво е "течка"??


Отговор
в отговор на Om_ #3

Re: Сборна памет

Това да не би да е портвано от Паскал/Делфи ? Щото гледам че индексацията почва от 1. Реално имаш използваеми BLOCK_SIZE-1 места в паметта.

Ако имаш повече от BLOCK_SIZE алокации, губиш тотално паметта от предните.

Ако при new текущия pFreeListHead ти е последния, то новия pFreeListHead ти е NULL. Съответно при последващ new алокираш наново памет ...

Нещо не мога да разбера въпроса като хората май

Абе тоя код не е много ясен, явно има нужда от оправяне, щом с 2-3 прегледа не може да стане ясно за какво става дума.

Ако идеята е да се направи къстъм алокация на обекти с предварително заделена памет, която да ползваш като кеш, защо не го направиш с два списъка - "заети" и "свободни" ? Доста по-лесно ще се менажират, и ще е по-ясно. Така и по-лесно ще можеш да разширяваш динамично бройката на свободните при нужда.
may the source be with you...

Редактирано от ak_47 на

Отговор
в отговор на Naki #4

Re: Сборна памет

Значи лийк

По темата - не е достатъчно да се ограничава само големината, а да се освобождава място от хиип, да не се резервира напразно <- това е ключовото.

Отговор
в отговор на ak_47 #5

Re: Сборна памет

Това сигурно е демо за блокиране, но аз не виждам без всичките тия щуротии, какво би било заплаха

Отговор
в отговор на ak_47 #6

Re: Сборна памет

Индексацията не започва от 1, чети внимателно.

The last good thing written in C was Franz Schubert's Symphony No. 9.
Отговор
в отговор на Om_ #7

Re: Сборна памет

Зависи от използването му. Не е чист лийк, защото някой сочи към паметта. За да се направи да държи само определен борй свободни обекти ще по-сложно (два списъка) и може би няма смисъл.

The last good thing written in C was Franz Schubert's Symphony No. 9.
Отговор
в отговор на Deern #8

Re: Сборна памет

Лийк не е ли теч? Защо течКА?
Другият вариант е: изтичане.


Редактирано от Naki на

Отговор
в отговор на Naki #9

Re: Сборна памет

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

Отговор
в отговор на Naki #10

Щото руски,

оттам и "сборная".
Кроманьонец такъв

Отговор
в отговор на Kirosviniata #11

Re: Щото руски,

Аз не питах за "сборна", а за "течка"-та.
Хмм, от руски сайтове бегам далече - знам руски, ама много им е сложен жаргона бре...


Отговор
в отговор на Naki #12

Виждам

колко знаеш

Отговор
в отговор на Kirosviniata #13

Re: Виждам

Руски програмистки жаргон/диалект НЕ знам, признавам си веднага.
И без друго е тъпо - има си английски думи, ама те не - искат да си имат техни!
Винт, глюк - ебаси.


Редактирано от Naki на

Отговор
в отговор на Naki #14

Тъпо казваш,

а да ти е хрумвало че си е в реда на нещата?
И не само за руски, и за немски, френски, италиански...нищо че не ги знаеш и тях

Отговор
в отговор на ak_47 #15

Re: Сборна памет

Ако имаш повече от BLOCK_SIZE алокации, губиш тотално паметта от предните.
И аз така мисля, от тук може да изтече доста памет, а не само максималният размер указан при задаването й (BLOCK_SIZE);

Редактирано от Om_ на

Отговор
в отговор на Om_ #16

Re: Сборна памет

BLOCK_SIZE не е никакъв максимален размер. Затова и в името му няма MAX. :)

The last good thing written in C was Franz Schubert's Symphony No. 9.
Отговор
в отговор на Kirosviniata #17

Re: Тъпо казваш,

Става дума за диалектни/жаргонни думи!
За основните, книжовни думи - ОК, ама тия допълнителните не виждам защо трябва за всяко нещо по компютъра да ги има.
Примерно: Твердый диск - ОК, винт - WTF!!??
Сравни на БГ: Твърд диск (офиц. дума), хард (жаргон) - нормално, поне е като на английски.


Отговор
в отговор на | #18

Re: Сборна памет

Значи мен ме притеснява какво се случи, когато pFreeListHead сочи към 0, ама не първоначално, а когато са се изчерпала заделената памет - ще задели нов блок и това може да продължи докато има памет, а предишният блок се губи.

Отговор
в отговор на Om_ #19

Re: Сборна памет

Предишния блок не се губи, обектите от него са алокирани и някой "знае" за тях. Ако някой извика delete, съответния обект (част от блока) ще се добави в списъка на свободни обекти. Разбира се, никаква памет няма да се освободи реално, но това не означава, че алокатора няма да работи добре в някои случаи. Трудно е да се каже дали идеята е малоумна без да се знае какви/колко обекти се заделят и колко време остават живи.

The last good thing written in C was Franz Schubert's Symphony No. 9.
Отговор
в отговор на Naki #20

Re: Тъпо казваш,

"Винт" вероятно идва от Winchester:

[линк]

The last good thing written in C was Franz Schubert's Symphony No. 9.

Редактирано от | на

Отговор