C++:关于"valid pointers and references"的澄清

C++: Clarification about "valid pointers and references"

本文关键字:references and pointers 关于 valid C++      更新时间:2023-10-16

我很难理解对stl无序列图实现的描述:

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

两个问题:

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

  2. ">
  3. 间接和单独分配"条目如何"增加大量 CPU 开销"?

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

不。这意味着,如果您获取映射中某个对象的地址,或绑定对此类对象的引用,则该指针或该引用不得因为添加或删除映射中的不相关元素而变得悬而未决。这是对实施std::unordered_map的要求。

这与例如std::vector行为。向向量添加元素可能会导致它重新分配,并且所有以前获取的指针和对元素的引用都悬而未决。

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

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

">

间接和单独分配"条目如何"增加大量 CPU 开销"?

现代 CPU 在访问内存中相邻的东西方面要快得多。 例如,它们在被要求之前开始加载后面的元素。如果目标地址不遵循简单的模式,则这种预测会更难。

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