【问题标题】:C++ boost::multi_index: order of iterator_to member functionC++ boost::multi_index:iterator_to 成员函数的顺序
【发布时间】:2016-06-26 20:45:08
【问题描述】:

阅读 boost::multi_index 参考,我发现iterator_to 方法具有恒定顺序。这怎么可能?我的意思是,如果一个迭代器是一个不同于它所代表的 value_type 的对象,那么容​​器怎么可能在不搜索索引的情况下找到它们对应的内部节点?

我能想到的唯一解决方案是容器的“内部节点”(或其他任何东西)的地址与它所拥有的 value_type 相同(例如,将节点标头放在 value_type 的下方或其他东西) .如果传入的参数是对内部 value_type 的引用,则可以通过参数的地址轻松构造对应的迭代器,从而得到红黑节点。

但是!! C++ 标准限制不能有两个具有相同地址的对象呢?对齐、填充、填充或任何可能在内存级别发生的事情呢?

【问题讨论】:

  • C++ 标准限制不能有两个具有相同地址的对象? 为什么不能有两个对具有相同地址的对象的引用?想象一下,我有一个需要两个引用的函数,并且我为它提供了两次相同的对象?
  • 如果我的记忆没有背叛我从标准中读取内容的那些时候,那么引用不是对象,并且两个引用参数都将“指向”相同且唯一的对象。根本没有违反规定的。但是,在我关于多索引容器内部的“假设”中,我们有两个不同的对象:保存在容器上的 value_type 和实际保存它的节点。

标签: c++ internals boost-multi-index


【解决方案1】:

您的直觉是正确的:该值是较大节点结构的一部分(例如 here 的解释),而 iterator_to 仅根据 value_type 子对象的地址计算节点的地址。现在,所涉及的指针算法依赖于节点(或存储值的基类)是standard-layout,这保证了指向第一个子对象(值)的指针可以转换为指向结构的指针(节点):相关代码可以看here。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2021-07-10
    • 2011-01-01
    • 1970-01-01
    • 2019-06-26
    相关资源
    最近更新 更多