[ Goran Arandjelovic @ 28.02.2006. 22:34 ] @
Da li bi neko mogao da mi objasni šta se zapravo dešava kada se alocira memorija za neki objekat na heapu? Dakle, ako učinim sledeće:

Code:

  int *x = new int;


Pretpostavljam da se rezerviše određeni prostor (blok) koji je zapravo veći od sizeof(int).

Kakva je struktura tog bloka?
Koje informacije su sve upisane?
Da li je negde upisana i veličina tog bloka i gde, etc..?

I..da li bi neko mogao da mi sažetije objasni koje bi jos eventualno bile mane memory poola sem one da se blok mora podeliti na chunkove iste veličine?

Koliki je overhead kod memory poola s obzirom da se koristi i vezana lista koja spaja slobodne chunkove? I..neki uporedni prikaz (na nekom primeru recimo) overheada kod poola i klasičnog alociranja na heapu?
[ NastyBoy @ 28.02.2006. 23:09 ] @
Ovo sve pitash generalno, ili konkretno za Boost::pool ?

Pisati memory-allocator-e je nauka za sebe, i ne postoji jedan nachin alokacije koji bi zadovoljio sve potrebe.

Zashto koristiti Boost::pool (ili bilo koji drugi pool-allocator) ti je objashnjeno na samom sajtu ( http://www.boost.org/libs/pool/doc/index.html. "Why/When should I use Pool").

Ukratko, pool-alloc se koristi uglavnom kada se zahteva veliki broj alokacija za objekte male (fiksne!) velichine. Standardni memory-allocator u sklopu OS-a jednostavno nije dobar za ovakve stvari. Korishcenjem pool-a dobijash na brzini i na osetnom smanjenju fragmentacije memorije (veoma bitno). Memory-allocatori uglavnom koriste linked-list da bi drzhali slobodne blokove na okupu, i taj overhead (koji i ne mora da postoji, zavisno od implementacije) ne bi trebao da te preterano brine (osim ako ne radish na nekom embedded sistemu sa jako malo memorije), usotalom i alokator u samom OS-u koristi isti princip.

Za detalje kako to implementira Boost (posebno obrati pazhnju na memory-alignement za alocirane blokove) pogledaj na samom Boost sajtu, i vishe je nego detaljno objashnjeno.
[ Dragi Tata @ 01.03.2006. 02:22 ] @
Citat:
NastyBoy:
Ukratko, pool-alloc se koristi uglavnom kada se zahteva veliki broj alokacija za objekte male (fiksne!) velichine. Standardni memory-allocator u sklopu OS-a jednostavno nije dobar za ovakve stvari. Korishcenjem pool-a dobijash na brzini i na osetnom smanjenju fragmentacije memorije (veoma bitno).


OT: jesi li koristio nekad Alexandrescu-ov Small Object Allocator? Baš me zanima kako to fercera u praksi, a nikad nisam probao. Ovde ima i adapter tog alokatora na std alokator:

http://www.codeproject.com/cpp/allocator.asp
[ NastyBoy @ 01.03.2006. 02:51 ] @
Nisam direktno koristio bash taj, jer sam slichne alokatore do sada pisao barem 10 puta :) Detaljno ga prouchio, ali nisam nashao nishta ekstra novo, sem shto je Alexandrescu, po obichaju, bio veoma pedantan i razmotrio sve moguce primene, probleme sa smart-pointerima i slichno. I naravno, sve zachinio templejtima :)

U principu, kada radish na mashinama sa ogranichenom memorijom (kao shto su, recimo, konzole za igru) prvo stupa na scenu memory-management. Kod "obichnih" desktop aplikacija to pitanje kasnije dolazi na red, ako ikada. Recimo, na trenutnom projektu imamo ukupno 7 razlichitih strategija za alokaciju (ili "policy-a" shto bi rek'o Andrei), od kojih 5 koriste fiksne memorijske blokove (Pool-ove), a 2 su "general purpose" za alokacije koje ne zahtevaju brzinu i striktnu kontrolu (i koriste standardni "best-fit" algoritam).

Ova knjiga je dobra za pogledati ako vas interesuje memory-management (mada ide u shirinu oko nekih stvari, i dalje je dobro shtivo)

[Ovu poruku je menjao NastyBoy dana 01.03.2006. u 03:52 GMT+1]