최근에 C++ 할당자가 어떻게 작동하는지 이해하려고 시도했으며 STL 라이브러리가 std::set
또는 std::map
과 같은 항목에 사용하는 빨강 - 검정 트리 구현을 조사했습니다. ,하지만 내 머리를 얻을 수없는 것들이 있습니다.C++ (STL 트리)에서 할당 자 사용
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'는 메모리를 할당하지 않으며, 객체를 생성합니다 (그리고 때로는 메모리를 할당하지만, 당신의 경우는 아닙니다). 그래서, 두 번째 줄 (':: new (__ node) _Rb_tree_node <_Val>;)은 아마'__node' 할당 된 메모리 블록에 노드를 만들 것이라고 말하고 싶습니다. – alexeykuzmin0
Ok, 왜 '__node' 포인터를 연산자에 전달합니까? 게다가, 노드를 생성한다면,':: construct()'는 나중에 무엇을 하는가? – gmardau
"이유는 포인터를 전달하는 이유"? 답을 설명 할 때, 이것은 _placement'new'_ 구문입니다. 그리고 그것은 새로운 객체를 어디에서 찾을 것인가를 어떻게 알 수 있을까요? –