Улучшения для этого распределителя стека C ++? - PullRequest
6 голосов
/ 21 апреля 2009

Есть предложения для моего стекового распределителя? (За исключением предложений использовать класс с частными / публичными членами)

struct Heap
{
    void* heap_start;
    void* heap_end;
    size_t max_end;

    Heap(size_t size)
    {
        heap_start = malloc(size);
        heap_end = heap_start;
        max_end = size + (size_t) heap_start;
    }

    ~Heap()
    {
        ::free(heap_start);
    }

    void* allocate(size_t bytes)
    {

        size_t new_end = ((size_t) heap_end) + bytes;

        if( new_end > max_end )
            throw std::bad_alloc();

        void* output = heap_end;
        heap_end = (void*) new_end;
        return output;
    }

}

Ответы [ 4 ]

4 голосов
/ 21 апреля 2009

Вы реализовали распределитель на основе стека. Вы не можете освободиться, не оставляя пробелов. Обычно пул относится к блоку смежной памяти со слотами фиксированного размера, которые дважды связаны между собой для добавления и удаления с постоянным временем.

Вот один , который вы можете использовать в качестве руководства. Он такой же, как у вас, но включает в себя базовые итераторы по выделенным узлам и использует шаблоны для распознавания типа.

4 голосов
/ 21 апреля 2009
size_t new_end = ((size_t) heap_end) + bytes;

Не хорошо , никогда не делайте таких вещей, вы предполагаете, что sizeof (size_t) == sizeof (void *), а также то, что происходит, если bytes==(size_t)(-1) это не будет работать

Кроме того, вам необходимо убедиться, что возвращаемые вами указатели выровнены. В противном случае у вас были бы проблемы. Поэтому вам нужно убедиться, что количество байт кратно 4 или 8 в зависимости от вашей платформы.

class {...
char *max_end,*head_end,*heap_start;
};

...
max_end=heap_start+size;
...
bytes=align_to_platform_specific_value(bytes);
if(max_end-heap_end >= bytes) {
   void* output = (void*)heap_end;
   heap_end+=bytes;
   return output;
}
throw std::bad_alloc();

Предложение? Не изобретайте велосипед. Есть много хороших пул библиотек.

2 голосов
/ 21 апреля 2009

Две очевидные проблемы:

1 / У вас нет deallocate().

2 / A deallocate() будет очень сложно написать с вашей текущей стратегией, если вы не собираетесь всегда освобождать в точном обратном порядке распределения. Вам нужно учитывать тот случай, когда клиент хочет освободить память в середине используемого раздела.

Конечно, если вы делаете освобождение в обратном порядке, (2) не является проблемой. И если вы вообще никогда не освобождаете память, (1) тоже не проблема.

Это зависит от того, что вы хотите, чтобы он делал.

1 голос
/ 21 апреля 2009

Ваша куча не разрешает освобождение. Как вы будете использовать его для объектов, выделенных с new в C ++?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...