![](/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.