Здравствуйте, 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);
И тогда мы также можем использовать один аллокатор для аллоцирования разных типов.
Вообще мне кажется это все дело вкуса, но все равно даже с точки зрения вкуса почему первый вариант может быть лучше второго?
Почему собственно я спрашиваю, да просто нужно начинать новый проект, который базируется на готовом проекте, и я хочу ипользовать второй вариант использования аллокаторов, который мне кажется логичнее и проще.
Но прежде хотелось бы быть уверенным что я ничего не упустил и потом не придется все рефакторить.