Ich habe vor kurzem versucht zu verstehen, wie C++ - Zuweiser arbeiten, und ich habe auf die Implementierung der rot-schwarz-Struktur, die die STL-Bibliothek für Dinge wie std::set
oder std::map
verwendet , aber es gibt einige Dinge, die ich nicht verstehen kann.Zuweisungsverwendung in C++ (STL-Struktur)
Das erste, was tut, ist den allocator vom Typ konvertiert die Behälter zu speichern haben - _Val
- auf die Art des Knotens, der Baum verwendet - _Rb_tree_node<_Val>
- die rebind Vorlage:
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;
Diese Ich kann es klären. Jetzt
, wenn ein Element eingesetzt ist, und es braucht einen neuen Knoten zu schaffen, was sie tut, ist dies
_Node_type __node = _Alloc_traits::allocate(_M_get_Node_allocator(), 1);
die ich zuordnet Raum für einen einzelnen Knoten übernehmen. Aber dann hat es diese
::new(__node) _Rb_tree_node<_Val>;
, die ich nicht wirklich wissen, was es tut, da der Raum für __node
bereits zugeteilt worden ist. Aber nach, dass es auch dieses tut
_Alloc_traits::construct(_M_get_Node_allocator(), __node->_M_valptr(), ...);
, die mich noch mehr verwirrt macht, weil angeblich ein Knoten konstruieren (ist der Knoten Allocator), aber es geht um den Zeiger __node->_M_valptr()
die _Val*
vom Typ ist.
Wenn jemand das erklären könnte, wäre ich sehr dankbar.
Der 'Operator new' reserviert keinen Speicher, er erzeugt ein Objekt (und manchmal auch Speicher, aber nicht in Ihrem Fall). Also, ich würde sagen, die zweite Zeile (':: new (__ Knoten) _Rb_tree_node <_Val>;') wahrscheinlich baut den Knoten in der '__node' zugewiesen Speicherblock – alexeykuzmin0
Ok, aber warum übergeben Sie den Zeiger' __node' an den Betreiber? Außerdem, wenn es den Knoten konstruiert, was macht das ':: construct()' danach? – gmardau
"Warum den Zeiger übergeben?" Wie die Antworten erklären, ist dies die _Placement 'new'_-Syntax. Und wie sonst würde es wissen, wo das _new__ Objekt _place_? –