C++ boost::multi_index: iterator_to 成员函数的顺序
C++ boost::multi_index: order of iterator_to member function
阅读boost::multi_index 参考文献,我发现iterator_to
方法具有恒定顺序。这怎么可能?我的意思是,如果一个迭代器是一个不同于它所代表的 value_type 的对象,容器怎么可能在不搜索索引的情况下找到它们对应的内部节点?
我唯一能想到的解决办法是容器的"internal node"(或者随便什么)的地址和它持有的value_type一样(比如把节点头就在 value_type 之类的下方)。如果传入的参数是对一个interal的引用value_type,可以通过参数的地址轻松构造对应的迭代器得到红黑节点
但是!!不能有两个对象具有相同地址的 C++ 标准限制怎么样?对齐、填充、填充或任何可能在内存级别发生的事情呢?
您的直觉是正确的:该值是更大节点结构的一部分(如 here) and iterator_to
merely calculates the address of the node from the address of the value_type
subobject. Now, the pointer arithmetics involved rely on the fact that the node (or the base class where the value is stored) is standard-layout, which guarantees that a pointer to first subobject (the value) can be cast to a pointer to the structure (the node): the relevant code can be looked at here.
中所解释的那样)
阅读boost::multi_index 参考文献,我发现iterator_to
方法具有恒定顺序。这怎么可能?我的意思是,如果一个迭代器是一个不同于它所代表的 value_type 的对象,容器怎么可能在不搜索索引的情况下找到它们对应的内部节点?
我唯一能想到的解决办法是容器的"internal node"(或者随便什么)的地址和它持有的value_type一样(比如把节点头就在 value_type 之类的下方)。如果传入的参数是对一个interal的引用value_type,可以通过参数的地址轻松构造对应的迭代器得到红黑节点
但是!!不能有两个对象具有相同地址的 C++ 标准限制怎么样?对齐、填充、填充或任何可能在内存级别发生的事情呢?
您的直觉是正确的:该值是更大节点结构的一部分(如 here) and iterator_to
merely calculates the address of the node from the address of the value_type
subobject. Now, the pointer arithmetics involved rely on the fact that the node (or the base class where the value is stored) is standard-layout, which guarantees that a pointer to first subobject (the value) can be cast to a pointer to the structure (the node): the relevant code can be looked at here.