Идиомы и стили С++ | страница 28



так, чтобы память бралась где нам надо, и operator delete() так чтобы он ничего не делал. И "шмат" называть "пулом". А то не поймут.

Я лишь чуть-чуть усложняю класс, только чтоб показать.

>#include ‹stdlib.h›

>// Класс пула

>class CPool {

>public:

> static char buffer[8096]; // статический буфер

> static char* position; // текущая позиция

> static void* getSomeMemory(size_t); // получить немного памяти

>};


>// вот получаем немного памяти.

>void* CPool::getSomeMemory(size_t bytes) {

> void* ret_val = position; // вернуть надо текущую позицию.

> position+=bytes; // а счетчик увеличить

> return ret_val;

>}


>// Это так… эксперимент.

>// Класс с собственным управлением памятью.

>class CThat {

>private:

> int m_some_number; // не знаю что.

>public:

> // перегруженные operator new, operaton delete

> void* operator new(size_t bytes) { return CPool::getSomeMemory(bytes); }

> void operator delete(void*) {}

>};


>// инициализация статических членов.

>char CPool::buffer[8096];

>char* CPool::position = CPool::buffer;

Чтобы довести его до более-менее приличного вида, нужно как минимум обрабатывать размер выделяемого блока и количество оставшейся памяти в буфере; сделать буфер нестатическим; при недостатке памяти выделять новый буфер-создавать новый экземпляр пула; статическими должны быть либо функция выделения памяти из пула либо указатель на свежий, незаполненный пул.

Несколько строк занудства.

Операционка неохотно берет себе память обратно. Возможно, освобожденный фрагмент вообще останется в ведении менеджера памяти самой программы, до ее завершения. Но конечно крупные куски она заглатывает тут же. Если возитесь с мелочью, проверьте этот момент на всякий случай; нет ничего приятнее свопа или уборки мусора в нужное время!

Глобальный оператор ::operator new() и глобальный оператор ::operator delete() не трогайте. Проще и намного умнее перегружать операторы в классах.

new, operator new и конструктор, а так же delete, operator delete и деструктор - АБСОЛЮТНО разные вещи. Как мы уже выяснили, их можно вызывать по отдельности. Не давайте себя запутать, если кто-нибудь будет говорить об операторе new - такого не бывает, бывает или оператор operator new(), или ключевое слово new.

Шаг 20 - Временные объекты. Неявные вызовы конструкторов и их подавление.

Не удается углубиться в какую-либо тему. Приходится касаться по верхам, потом переключаться на что-то другое. С другой стороны, может это и правильно, часто достаточно только знать, что есть ТАКОЕ решение, а изучить детально можно и позже, когда сделаешь окончательный выбор. Да и не очень это интересно - что за радость переписать двадцать страниц из учебника, или перевести статью какого-нибудь доктора