这个结构的数据位于内存中的哪个位置?

时间:2014-05-20 18:48:11

标签: c++ pointers memory-management stl

我正在查看stl_tree.h中std :: set的GCC源代码,并且有:

  enum _Rb_tree_color { _S_red = false, _S_black = true };

  struct _Rb_tree_node_base
  {
    typedef _Rb_tree_node_base* _Base_ptr;
    typedef const _Rb_tree_node_base* _Const_Base_ptr;

    _Rb_tree_color  _M_color;
    _Base_ptr       _M_parent;
    _Base_ptr       _M_left;
    _Base_ptr       _M_right;

    static _Base_ptr
    _S_minimum(_Base_ptr __x)
    {
      while (__x->_M_left != 0) __x = __x->_M_left;
      return __x;
    }

    static _Const_Base_ptr
    _S_minimum(_Const_Base_ptr __x)
    {
      while (__x->_M_left != 0) __x = __x->_M_left;
      return __x;
    }

    static _Base_ptr
    _S_maximum(_Base_ptr __x)
    {
      while (__x->_M_right != 0) __x = __x->_M_right;
      return __x;
    }

    static _Const_Base_ptr
    _S_maximum(_Const_Base_ptr __x)
    {
      while (__x->_M_right != 0) __x = __x->_M_right;
      return __x;
    }
  };

三个指针数据成员:

    _Base_ptr       _M_parent;
    _Base_ptr       _M_left;
    _Base_ptr       _M_right;

假设默认分配器,这些指针指向的数据会在堆上随机分配吗?

更新:

@Jeff我想弄清楚,看看这段代码:

struct _Rb_tree_impl : public _Node_allocator
        {
      _Key_compare      _M_key_compare;
      _Rb_tree_node_base    _M_header;
      size_type         _M_node_count; // Keeps track of size of tree.
           .
           .
           .

_M_node_count_M_header._M_left会在不同的缓存行中吗?这里引用了它们:

const_iterator begin() const _GLIBCXX_NOEXCEPT
{ 
   return const_iterator(static_cast<_Const_Link_type>(this->_M_impl._M_header._M_left));
}

  size_type size() const _GLIBCXX_NOEXCEPT 
  { 
      return _M_impl._M_node_count; 
  }

1 个答案:

答案 0 :(得分:2)

g ++库实际上将_Rb_tree_node_base类型用于两个不同的目的:

  1. 红黑树的节点。派生自_Rb_tree_node_base的类型的一个对象在堆上为容器中的每个元素分配。

    一个。 _M_color是枚举,将红黑树算法的节点声明为红色或黑色。

    _M_parent指向父节点,或者如果节点是根节点,则指向树的&#34;标题&#34; (见下文)。

    ℃。 _M_left指向左子节点,如果没有则指向null。

    d。 _M_right指向右子节点,如果没有则指向null。

    即派生类中的另一个成员包含实际的容器元素。

  2. &#34;标题&#34;,它是实际容器对象中的子对象_M_header

    一个。 _M_color总是红色的(这有助于一些迭代器算法)。

    _M_parent指向根节点,如果容器为空,则为null。

    ℃。 _M_left按排序顺序指向第一个节点,如果容器为空,则指向标题本身。

    d。 _M_right以排序顺序指向最后一个节点,如果容器为空,则指向标题本身。

  3. 一个迭代器,它是&#34;过去的结束&#34;也指向容器的标题。

    所以(几乎)回答你的问题,c._M_node_countc._M_header._M_left都是c的子对象。但如果c不为空,则c._M_header._M_left指向的数据超出c,并由c的分配器分配。