Идиомы и стили С++ | страница 28
Я лишь чуть-чуть усложняю класс, только чтоб показать.
>#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 - Временные объекты. Неявные вызовы конструкторов и их подавление.
Не удается углубиться в какую-либо тему. Приходится касаться по верхам, потом переключаться на что-то другое. С другой стороны, может это и правильно, часто достаточно только знать, что есть ТАКОЕ решение, а изучить детально можно и позже, когда сделаешь окончательный выбор. Да и не очень это интересно - что за радость переписать двадцать страниц из учебника, или перевести статью какого-нибудь доктора