![](/img/trans.png)
[英]c++: how to insert data to a struct member (struct located in vector)
[英]Where is the data of this struct located in memory?
我正在看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;
}
g ++库实际上将_Rb_tree_node_base
类型用于两个不同的目的:
红黑树的节点。 在堆上为容器中的每个元素分配一个从_Rb_tree_node_base
派生的类型的对象。
一种。 _M_color
是一个枚举,用于针对红黑树算法将节点声明为红色或黑色。
湾 _M_parent
指向父节点,或者如果该节点是根节点,则指向树的“标头”(请参见下文)。
C。 _M_left
指向左子节点;如果没有,则为null。
d。 _M_right
指向右子节点;如果没有,则为null。
即 派生类中的另一个成员包含实际的容器元素。
“标题”,它是实际容器对象内的子对象_M_header
。
一种。 _M_color
始终为红色(这有助于某些迭代器算法)。
湾 _M_parent
指向根节点;如果容器为空,则为null。
C。 _M_left
按排序顺序指向第一个节点,如果容器为空, _M_left
指向标头本身。
d。 _M_right
按排序顺序指向最后一个节点,如果容器为空, _M_right
指向标题本身。
一个“ past-the-end”的迭代器也指向容器的标头。
因此,(几乎)回答您的问题, c._M_node_count
和c._M_header._M_left
都是c
子对象。 但是,如果c
不为空,则c._M_header._M_left
指向的数据在c
之外,并由c
的分配器分配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.