Re[2]: Использование аллокатора
От: koenjihyakkei Россия  
Дата: 12.10.19 19:48
Оценка:
Здравствуйте, K13, Вы писали:

K13>А где во втором варианте нестандартное выделение памяти?

K13>В общем случае в первом варианте вместо malloc может быть что угодно -- например, при написании плагина к какой-нибудь системе "большие" куски памяти надо просить через подсистему хоста. Иначе в 32-битном режиме вылетим по Out Of Memory.

Да, там нестандартное выделение памяти, просто тут для упрощения написал malloc.

K13>Во втором случае память выделяется стандартным new.

K13>Или надо было уж расписывать malloc + placement new и возврат указателя, чтобы функционал двух вариантов совпадал, отличаясь синтаксисом.

Да, наверное нужно было написать через malloc + placement new, но это тоже несущественно.

K13>Еще одно соображение: первый вариант позволяет одному экземпляру аллокатора работать с разными типами (разных размеров).

K13>Во втором варианте экземпляр аллокатора будет на каждый класс, даже если у разных классов размеры совпадают.

Вот это уже существенное замечание. Действительно аллокатор используется для разных типов данных.
Но тогда второй вариант можно переписать так:

struct Foo {
    Foo(int n) {}
};

struct Allocator {
    template<class T, typename Args...>
    T* Alloc(Args ... args) {
        return new T(std::forward<Args>(args)...);
    }
};

Allocator allocator;
Foo* foo = allocator.Alloc<Foo>(42);


И тогда мы также можем использовать один аллокатор для аллоцирования разных типов.

Вообще мне кажется это все дело вкуса, но все равно даже с точки зрения вкуса почему первый вариант может быть лучше второго?

Почему собственно я спрашиваю, да просто нужно начинать новый проект, который базируется на готовом проекте, и я хочу ипользовать второй вариант использования аллокаторов, который мне кажется логичнее и проще.
Но прежде хотелось бы быть уверенным что я ничего не упустил и потом не придется все рефакторить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.