LINUX.ORG.RU

C++ memory allocator

 ,


0

3

в реализации libstdc++ есть класс new_allocator(http://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc /api/a00958_source.html), от которого без каких-либо видимых причин наследуется std::allocator(http://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc /api/a00751_source.html), который и используется по умолчанию во всей остальной части библиотеки. Может кто-то пояснить причину такого наследования, и почему нельзя было ограничиться базовым классом?

кроме того, возник вопрос по реализации new_allocator, конкретно функции construct

void 
construct(pointer __p, const _Tp& __val) 
::new((void *)__p) _Tp(__val); }

затрудение вызывает ::new(void* adr), хотя в заголовке <new>(http://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc /api/a00957_source.html) указаны только ::operator new(size_t n). где я могу почитать про ::new(void* adr) ?

new_allocator потому что выделяется память конструкцией new.

затрудение вызывает ::new(void* adr) ...

По ссылке не нашел такого.

numas13
()
Ответ на: комментарий от numas13

new_allocator.h строка 00108

а так allocator наследует все функции от new_allocator, какой смысл в самом allocator? получается что просто новая сущность, которая делает тоже самое, что и new_allocator ...

arcticblues
() автор топика
Ответ на: комментарий от arcticblues

Там в коде очень хитрая ловушка. Пример.

template<class T>
class A {};

class B {};

template<class T>
class C;

template<>
class C<void> {};

template<typename T>
class C : public A<T> {};

template<>
class C<float> : public B {};
numas13
()
Ответ на: комментарий от numas13

у allocator есть специализация в allocator<void> -> чтобы не пытаться выделить память под void(?). ну и стандартный allocator<_Tp> - для всего остального. нельзя ли было точно также специализировать new_alloc на void и всё остальное? и поясните пожайста про ловушку, я глупый, я не понял(

arcticblues
() автор топика
Ответ на: комментарий от arcticblues

Извините, это я неправильно выразился. Хотел сказать, что new_allocator возможно не единственный, с такой схемой возможна специализация allocator под разные типы данных. Но это лишь моё предположение, которое я пока не могу подтвердить.

numas13
()

Ты пытаешься осмыслить вещи которые вызывают затруднения у самих авторов STL. Например, не приходила тебе в голову мысль почему аллокатор возвращает T*, хотя никакого T до того как отработал конструктор там нет, только сырые байты? Саттер вот не знает почему.

Absurd ★★★
()
Ответ на: комментарий от Absurd

это как раз понятно - чтобы при allocate нескольких элементов мы могли итерировать по T*, а не по void*, чтобы дальше там делать construct.

а вот существование new_allocator действительно объясняется только существованием allocator<void>, хотя я всё равно не понял, почему нельзя было сразу сделать new_allocator<void> & new_allocator<_Tp> для всего остального...

arcticblues
() автор топика
Ответ на: комментарий от arcticblues

А записать sizeof(T) в локальный enum и считать смещение через умножение это недостаточно концептуально?

Absurd ★★★
()
Ответ на: комментарий от numas13

new(void* adr)

char *data = new char[sizeof(MyClass)]; MyClass *class = new (data) MyClass();

Вызывается оператор new(void *)

vova7890 ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.