C ++:关于“有效的指针和引用”的说明

时间:2019-05-30 07:51:27

标签: c++ memory stl unordered-map unordered-set

我很难理解this description of stl unordered map's implementation

  

C ++的标准模板库(STL)通过std :: unordered_map和std :: unordered_set提供哈希表。该标准保证了引用稳定性:哈希表中键和值的引用和指针必须保持有效,直到删除相应的键为止。实际上,这意味着条目必须是间接的并且要单独分配,这会增加大量的CPU开销。

两个问题:

  1. 当作者说“指向键和值的引用和指针...必须保持有效”时,这是否意味着在插入项目后,指针和引用对于整个程序来说必须存在吗?当我使用“ new”在堆上分配对象并且指向它的指针超出范围时不再有效。考虑到哈希表已经引用了堆上的对象,我不确定引用/指针为什么需要保持有效。

  2. “间接分配的”条目如何“增加大量CPU开销”?

1 个答案:

答案 0 :(得分:0)

  

当作者说“指向键和值的引用和指针...必须保持有效”时,这是否意味着在插入项目后,指针和引用对于整个程序来说必须存在?

不。这意味着,如果您获取地图中某个对象的地址,或将引用绑定到该对象,则由于添加或删除了地图中不相关的元素,该指针或该引用一定不能成为悬挂对象。这是实施std::unordered_map的要求。

这与例如std::vector表现良好。在向量中添加元素会导致其重新分配,并且所有先前获取的指针和对元素的引用都悬而未决。

  

当我使用new在堆上分配对象,并且指向该对象的指针超出范围并且不再有效时。

否,该指针不再存在,具有相同值的其他指针仍指向您new编辑的对象。

  

“间接分配的”条目如何“增加大量CPU开销”?

现代CPU在访问内存中相邻的事物时要快得多。例如。他们开始在之前要求他们加载以后的元素。如果目标地址不遵循简单的模式,则这种预测将更加困难。

您链接的文章重点介绍了标准委员会做出的使std::unordered_map不适合作者目的的设计选择。他们编写了一对具有与std::unordered_map相同的公共成员(具有相同含义)的类,作为“替代”替代。