在对您原始问题的评论中,我提到它可能是 a boost::fusion::map
,并询问bool
在+0x14
和处是否有两个值+0x15
。然后,您使用显示这些位置的布尔值的图像更新了您的帖子。
我认为我最初的猜测是正确的。它似乎是一个boost::fusion::container::map
. 对于 MSVC 的 STL 实现,_Tree_node<T>
几十年来的定义都是一样的:
// Simplified version of MSVC's xtree _Tree_node<T>
template <typename T>
struct _Tree_node {
_Tree_node *_Left; // Pointers to neighbors
_Tree_node *_Parent;
_Tree_node *_Right;
bool _Color; // Red-Black tree stuff
bool _Isnil;
T _Myval; // Node value. For map<K,V>, this is a pair<K,V>.
// For set<T>, this is just a T.
};
这就是我在使用std::set
或 对MSVC 代码进行逆向工程时 100%std::map
看到的情况,您可以在Microsoft STL GitHub 存储库xtree
上看到自己的真实实现。
当我对 boost 程序进行逆向工程时,我注意到数据结构实际上与 MSVC STL 相同,只是T
数据位于两个bool
值之前。它看起来像这样:
// Replica of boost tree nodes
template <typename T>
struct _Tree_node {
_Tree_node *_Left; // Same as before
_Tree_node *_Parent;
_Tree_node *_Right;
T _Myval; // Data. In MSVC, is after booleans.
bool _Color; // Booleans. In MSVC, is before data.
bool _Isnil;
};
我会直接链接到显示可比较类定义的 boost 存储库,但实际上我一直无法找到它,尽管我花了 30 多分钟试图这样做。(如果您认为 MSVC STL 代码难以阅读,请尝试阅读 boost。)