Недавно я пытался понять, как работают распределители C++, и искал реализацию красно-черного дерева, которое библиотека STL использует для таких вещей, как std::set
или std::map
, но есть некоторые вещи, которые я не могу понять. получить мою голову вокруг.
Первое, что нужно сделать, это преобразовать распределитель из типа, который должен хранить контейнер — _Val
— в тип узла, который использует дерево — _Rb_tree_node<_Val>
— с помощью шаблона повторной привязки:
typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
rebind<_Rb_tree_node<_Val> >::other _Node_allocator;
typedef __gnu_cxx::__alloc_traits<_Node_allocator> _Alloc_traits;
В этом я могу разобраться.
Теперь, когда элемент вставлен и ему нужно создать новый узел, он делает следующее:
_Node_type __node = _Alloc_traits::allocate(_M_get_Node_allocator(), 1);
который, как я предполагаю, выделяет место для одного узла. Но тогда он делает это
::new(__node) _Rb_tree_node<_Val>;
что я действительно не знаю, что он делает, так как место для __node
уже выделено. Но после этого он также делает это
_Alloc_traits::construct(_M_get_Node_allocator(), __node->_M_valptr(), ...);
что меня еще больше сбивает с толку, потому что якобы строит узел (является распределителем узлов), но передает указатель __node->_M_valptr()
типа _Val*
.
Если бы кто-то мог объяснить это, я был бы очень благодарен.
operator new
не выделяет память, он создает объект (а иногда еще и выделяет память, но не в вашем случае). Итак, я бы сказал, что вторая строка (::new(__node) _Rb_tree_node<_Val>;
), вероятно, создает узел в__node
выделенном блоке памяти. - person alexeykuzmin0   schedule 17.08.2016__node
? Кроме того, если он создает узел, что делает потом::construct()
? - person gmardau   schedule 17.08.2016new
. А как еще он узнает, где поместить объектnew
? - person underscore_d   schedule 17.08.2016new
при обычном использовании делает две вещи: оно выделяет память, а затем вызывает функциюoperator new
и передает ей указатель на память, и эта функция использует конструктор для создания объекта в этом месте в памяти. - person Mooing Duck   schedule 17.08.2016