Информация об изменениях

Сообщение Re[2]: Собственный аллокатор с задаваемым выделением памяти от 07.04.2018 16:39

Изменено 07.04.2018 18:35 avovana

Re[2]: Собственный аллокатор с задаваемым выделением памяти
Здравствуйте, Константин, Вы писали:

К>Это для производительности нужно?


Очень интересный пример, посмотрел. Мощный.
Но у меня свой маленький проект.
Сейчас прохожу курс С++ программиста.
После очередной лекции было такое дз по созданию собственного аллокатора и list'a.

Пока list отложил в сторону, занят аллокатором.
На данный момент сделано задание выделяемой памяти аллокатору с помощью параметра.
Раньше был голый указатель на выделяемую память и выделялось всё отлично:
template <typename T, size_t Size = 400>
struct Allocator {
    using value_type = T;
    using pointer = T *;

    unsigned char * const data;
    std::size_t const size;
    std::size_t offset;  

    Allocator()
    : data(static_cast<unsigned char *>(::operator new(Size)))
    , size(Size)
    , offset(0)
    { }

    pointer allocate(std::size_t n)
    {
        if (offset + n > size)
        {
            throw std::bad_alloc();
        }

        void * result = data + offset;
        offset += n;
        
        return static_cast<pointer>(result);
    }
...
}


Но освобождение памяти, я так понимаю, не происходило. Надо было обернуть data в unique_ptr, что было сделано.
Но полетели ошибки.

Вот код:
https://wandbox.org/permlink/2ESCMj6eA6tT477R

В основном файле создается std::map с собственным аллокатором. std::map заполняется элементами.
В файле allocatorarena.h реализация аллокатора. Функционал arena'ы уже выброшен. Есть просто аллокатор.
Вспомогательные файлы newdelete.h и newdelete.cc помогают сделать видимыми выделение и освобождение памяти.
В файле forward_list.h реализация контейнера, что пока не нужно.

Сам немного запутался и не могу понять что не так делается.

Need help
Re[2]: Собственный аллокатор с задаваемым выделением памяти
Здравствуйте, Константин, Вы писали:

К>Это для производительности нужно?


Очень интересный пример, посмотрел. Мощный.
Но у меня свой маленький проект.
Сейчас прохожу курс С++ программиста.
После очередной лекции было такое дз по созданию собственного аллокатора и list'a.

Здравствуйте, watchmaker, Вы писали:
w>Ну назвать этот код работающим можно весьма условно

Решил уйти от Arena.

Ситуация на данный момент следующая.
Пока list отложил в сторону, занят аллокатором.
На данный момент сделано задание выделяемой памяти аллокатору с помощью параметра.
Раньше был голый указатель на выделяемую память и выделялось всё отлично:
template <typename T, size_t Size = 400>
struct Allocator {
    using value_type = T;
    using pointer = T *;

    unsigned char * const data;
    std::size_t const size;
    std::size_t offset;  

    Allocator()
    : data(static_cast<unsigned char *>(::operator new(Size)))
    , size(Size)
    , offset(0)
    { }

    pointer allocate(std::size_t n)
    {
        if (offset + n > size)
        {
            throw std::bad_alloc();
        }

        void * result = data + offset;
        offset += n;
        
        return static_cast<pointer>(result);
    }
...
}


Но освобождение памяти, я так понимаю, не происходило. Надо было обернуть data в unique_ptr, что было сделано(про что писали — RAII).
Но полетели ошибки.

Вот код:
https://wandbox.org/permlink/2ESCMj6eA6tT477R

В основном файле создается std::map с собственным аллокатором. std::map заполняется элементами.
В файле allocatorarena.h реализация аллокатора. Функционал arena'ы уже выброшен. Есть просто аллокатор.
Вспомогательные файлы newdelete.h и newdelete.cc помогают сделать видимыми выделение и освобождение памяти.
В файле forward_list.h реализация контейнера, что пока не нужно.

Сам немного запутался и не могу понять что не так делается.

Need help