最近、C++アロケータの動作を理解しようとしており、STLライブラリがstd::set
またはstd::map
などの目的で使用する赤黒のツリーの実装を検討しています。しかし、頭がおかしくないことがいくつかあります。C++でのアロケータの使用
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;
これ:_Val
- - - _Rb_tree_node<_Val>
を - 再バインドテンプレートを使用してツリーが使用するノードのタイプを行い
まず、コンテナが格納しなければならないタイプのアロケータを変換であります私は整理することができます。要素が挿入されると、それはそれが何をするか、新しいノードを作成する必要がある
今は、私は単一のノードに割り当てるスペースを想定し、この
_Node_type __node = _Alloc_traits::allocate(_M_get_Node_allocator(), 1);
です。 __node
のためのスペースがすでに割り当てられているので、しかし、それは、私は本当にそれが何をするか分からない、この
::new(__node) _Rb_tree_node<_Val>;
を行います。しかし、その後、それはまた、おそらくノードを構築していること(ノードアロケータである)ので、私はさらに混乱します。この
_Alloc_traits::construct(_M_get_Node_allocator(), __node->_M_valptr(), ...);
を行いますが、それはタイプ_Val*
であるポインタ__node->_M_valptr()
を渡します。
誰かがこれを説明できる場合、私は非常に感謝します。
'operator new'はメモリを割り当てません。オブジェクトを作成します(場合によってはメモリも割り当てますが、あなたの場合は割り当てません)。だから、私は2番目の行( ':: new(__ node)_Rb_tree_node <_Val>;')はおそらく '__node'割り当てメモリブロックのノードを構築すると言っています – alexeykuzmin0
しかし、なぜ' __node'ポインタを演算子に渡しますか?さらに、ノードを構築する場合、 ':: construct()'は後で何をしますか? – gmardau
"なぜポインタを渡すのですか"?答えが説明するように、これは_placement 'new'_構文です。そして、それはどこに新しいオブジェクトをどこに置くべきかを知っていますか? –