Сборна памет
39 отговора
0 прегледа
Сборна памет
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_ на
Re: Сборна памет
Това да не би да е портвано от Паскал/Делфи ? Щото гледам че индексацията почва от 1. Реално имаш използваеми BLOCK_SIZE-1 места в паметта.
Ако имаш повече от BLOCK_SIZE алокации, губиш тотално паметта от предните.
Ако при new текущия pFreeListHead ти е последния, то новия pFreeListHead ти е NULL. Съответно при последващ new алокираш наново памет ...
Нещо не мога да разбера въпроса като хората май
Абе тоя код не е много ясен, явно има нужда от оправяне, щом с 2-3 прегледа не може да стане ясно за какво става дума.
Ако идеята е да се направи къстъм алокация на обекти с предварително заделена памет, която да ползваш като кеш, защо не го направиш с два списъка - "заети" и "свободни" ? Доста по-лесно ще се менажират, и ще е по-ясно. Така и по-лесно ще можеш да разширяваш динамично бройката на свободните при нужда.
may the source be with you...
Ако имаш повече от BLOCK_SIZE алокации, губиш тотално паметта от предните.
Ако при new текущия pFreeListHead ти е последния, то новия pFreeListHead ти е NULL. Съответно при последващ new алокираш наново памет ...
Нещо не мога да разбера въпроса като хората май
Абе тоя код не е много ясен, явно има нужда от оправяне, щом с 2-3 прегледа не може да стане ясно за какво става дума.
Ако идеята е да се направи къстъм алокация на обекти с предварително заделена памет, която да ползваш като кеш, защо не го направиш с два списъка - "заети" и "свободни" ? Доста по-лесно ще се менажират, и ще е по-ясно. Така и по-лесно ще можеш да разширяваш динамично бройката на свободните при нужда.
may the source be with you...
Редактирано от ak_47 на
Re: Сборна памет
Значи лийк
По темата - не е достатъчно да се ограничава само големината, а да се освобождава място от хиип, да не се резервира напразно <- това е ключовото.
По темата - не е достатъчно да се ограничава само големината, а да се освобождава място от хиип, да не се резервира напразно <- това е ключовото.
Re: Сборна памет
Това сигурно е демо за блокиране, но аз не виждам без всичките тия щуротии, какво би било заплаха 
Re: Сборна памет
Индексацията не започва от 1, чети внимателно.
The last good thing written in C was Franz Schubert's Symphony No. 9.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Сборна памет
Зависи от използването му. Не е чист лийк, защото някой сочи към паметта. За да се направи да държи само определен борй свободни обекти ще по-сложно (два списъка) и може би няма смисъл.
The last good thing written in C was Franz Schubert's Symphony No. 9.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Сборна памет
Лийк не е ли теч? Защо течКА?
Другият вариант е: изтичане.
Другият вариант е: изтичане.
Редактирано от Naki на
Re: Сборна памет
Нямам идея какво пише в речника, но ако не разбираш български на кирилица, гледай кода на латиница, там пише същото 
Re: Щото руски,
Аз не питах за "сборна", а за "течка"-та.
Хмм, от руски сайтове бегам далече - знам руски, ама много им е сложен жаргона бре...
Хмм, от руски сайтове бегам далече - знам руски, ама много им е сложен жаргона бре...
Re: Виждам
Руски програмистки жаргон/диалект НЕ знам, признавам си веднага.
И без друго е тъпо - има си английски думи, ама те не - искат да си имат техни!
Винт, глюк - ебаси.
И без друго е тъпо - има си английски думи, ама те не - искат да си имат техни!
Винт, глюк - ебаси.
Редактирано от Naki на
Тъпо казваш,
а да ти е хрумвало че си е в реда на нещата?
И не само за руски, и за немски, френски, италиански...нищо че не ги знаеш и тях
И не само за руски, и за немски, френски, италиански...нищо че не ги знаеш и тях
Re: Сборна памет
Ако имаш повече от BLOCK_SIZE алокации, губиш тотално паметта от предните.
И аз така мисля, от тук може да изтече доста памет, а не само максималният размер указан при задаването й (BLOCK_SIZE);
И аз така мисля, от тук може да изтече доста памет, а не само максималният размер указан при задаването й (BLOCK_SIZE);
Редактирано от Om_ на
Re: Сборна памет
BLOCK_SIZE не е никакъв максимален размер. Затова и в името му няма MAX. :)
The last good thing written in C was Franz Schubert's Symphony No. 9.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Тъпо казваш,
Става дума за диалектни/жаргонни думи!
За основните, книжовни думи - ОК, ама тия допълнителните не виждам защо трябва за всяко нещо по компютъра да ги има.
Примерно: Твердый диск - ОК, винт - WTF!!??
Сравни на БГ: Твърд диск (офиц. дума), хард (жаргон) - нормално, поне е като на английски.
За основните, книжовни думи - ОК, ама тия допълнителните не виждам защо трябва за всяко нещо по компютъра да ги има.
Примерно: Твердый диск - ОК, винт - WTF!!??
Сравни на БГ: Твърд диск (офиц. дума), хард (жаргон) - нормално, поне е като на английски.
Re: Сборна памет
Значи мен ме притеснява какво се случи, когато pFreeListHead сочи към 0, ама не първоначално, а когато са се изчерпала заделената памет - ще задели нов блок и това може да продължи докато има памет, а предишният блок се губи.
Re: Сборна памет
Предишния блок не се губи, обектите от него са алокирани и някой "знае" за тях. Ако някой извика delete, съответния обект (част от блока) ще се добави в списъка на свободни обекти. Разбира се, никаква памет няма да се освободи реално, но това не означава, че алокатора няма да работи добре в някои случаи. Трудно е да се каже дали идеята е малоумна без да се знае какви/колко обекти се заделят и колко време остават живи.
The last good thing written in C was Franz Schubert's Symphony No. 9.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Тъпо казваш,
"Винт" вероятно идва от Winchester:
[линк]
The last good thing written in C was Franz Schubert's Symphony No. 9.
[линк]
The last good thing written in C was Franz Schubert's Symphony No. 9.
Редактирано от | на