pObj
класы үшін өзіндік
new
опе-
рациясын жазуға болады, ол жадының үлкен блогын бөліп, содан кейін онда
Obj
объектісіне нұсқауыштарды орналастырады. Бұл үшін
pObj
объектісіне
headOfFree
статикалық өрісі енгізіледі, бұл өрісте кезекті объектіні орнала-
стыру үшін блоктың алғашқы бос объектісіне нұсқауыш сақталады.
Қолданылмайтын ұяшықтар тізімге байланыстырылады. Байланыс өрісіне
жады жұмсамау үшін біріктірме (
union
) қолданылады, оның көмегімен бір
ғана ұяшық объектіге нұсқауышты орналастыру үшін де немесе келесі бос
ұяшықпен байланыс орнату үшін де қолданылады:
class pObj{
public:
static void * operator new(size_t size);
...
private:
union{
Obj *p; // Объектіге нұсқауыш
pObj *next; // Келесі бос ұяшыққа нұсқауыш
};
static const int BLOCK_SIZE;// Блоктың өлшемі
// Бос ұяшықтар тізімінің тақырыбы:
static pQbj *headOfFree;
};
void * pObj::operator new(size_t size){
// new стандартты операциясының дұрыс көрсетілмеген
// жады көлеміне сұранысын қайта бағыттау:
if (size != sizeof(pObj)) return ::operator
new(size);
pObj *p = headOfFree; //Алғашқы бос ұяшыққа нұсқауыш
// Бос ұяшықтар тізімінің нұсқауышын жылжыту:
if (p) headOfFree = р -> next;
14-1140
210
// Егер жадыда бос орын болмаса, кезекті блокты бөлеміз:
else {
pObj *newblock = static_cast
1
(::operator new(BLOCK_SIZE * sizeof(pObj)));
// Біріншіден басқа барлық ұяшықтар бос (ол
// қолданылуда), оларды байланыстырамыз:
Достарыңызбен бөлісу: |