Сообщение Re[2]: Собственный аллокатор с задаваемым выделением памяти от 07.04.2018 16:39
Изменено 07.04.2018 18:35 avovana
Re[2]: Собственный аллокатор с задаваемым выделением памяти
Здравствуйте, Константин, Вы писали:
К>Это для производительности нужно?
Очень интересный пример, посмотрел. Мощный.
Но у меня свой маленький проект.
Сейчас прохожу курс С++ программиста.
После очередной лекции было такое дз по созданию собственного аллокатора и list'a.
Пока list отложил в сторону, занят аллокатором.
На данный момент сделано задание выделяемой памяти аллокатору с помощью параметра.
Раньше был голый указатель на выделяемую память и выделялось всё отлично:
Но освобождение памяти, я так понимаю, не происходило. Надо было обернуть data в unique_ptr, что было сделано.
Но полетели ошибки.
Вот код:
https://wandbox.org/permlink/2ESCMj6eA6tT477R
В основном файле создается std::map с собственным аллокатором. std::map заполняется элементами.
В файле allocatorarena.h реализация аллокатора. Функционал arena'ы уже выброшен. Есть просто аллокатор.
Вспомогательные файлы newdelete.h и newdelete.cc помогают сделать видимыми выделение и освобождение памяти.
В файле forward_list.h реализация контейнера, что пока не нужно.
Сам немного запутался и не могу понять что не так делается.
Need help
К>Это для производительности нужно?
Очень интересный пример, посмотрел. Мощный.
Но у меня свой маленький проект.
Сейчас прохожу курс С++ программиста.
После очередной лекции было такое дз по созданию собственного аллокатора и 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 отложил в сторону, занят аллокатором.
На данный момент сделано задание выделяемой памяти аллокатору с помощью параметра.
Раньше был голый указатель на выделяемую память и выделялось всё отлично:
Но освобождение памяти, я так понимаю, не происходило. Надо было обернуть 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
К>Это для производительности нужно?
Очень интересный пример, посмотрел. Мощный.
Но у меня свой маленький проект.
Сейчас прохожу курс С++ программиста.
После очередной лекции было такое дз по созданию собственного аллокатора и 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