C++:关于 "valid pointers and references" 的说明
C++: Clarification about "valid pointers and references"
我很难理解this description of stl unordered map's implementation:
The standard template library (STL) for C++ provides hash tables via std::unordered_map and std::unordered_set. The standard guarantees reference stability: References and pointers to the keys and values in the hash table must remain valid until the corresponding key is removed. In practice, this means the entries must be indirect and individually allocated, which adds a substantial CPU overhead.
两个问题:
当作者说 "references and pointers to the keys and values ... must remain valid" 是不是意味着在我插入一个项目之后,指针和引用必须在整个程序中存在?当我使用 "new" 在堆上分配对象并且指向它的指针超出范围并且不再有效时。我不确定为什么 reference/pointer 需要保持有效,因为散列 table 引用了堆上的对象。
如何"indirect and individually allocated"条目"add substantial CPU overhead"?
When the author says "references and pointers to the keys and values ... must remain valid" does that mean that after I insert an item, the pointer and reference must live for the entirety of the program?
没有。这意味着,如果您获取映射中某个对象的地址,或将引用绑定到此类对象,则该指针或该引用不得因为添加或删除映射中不相关的元素而变得悬空。这是对 std::unordered_map
.
实施的要求
这与例如std::vector
行为举止。向向量中添加元素会导致它重新分配,并且之前获取的所有指针和对元素的引用都处于悬空状态。
When I use new
to allocate the object on the heap and the pointer to it goes out of scope and is no longer valid.
不,该指针不复存在,其他具有相同值的指针仍指向您new
编辑的对象。
How do "indirect and individually allocated" entries "add substantial CPU overhead"?
现代 CPU 在访问内存中相邻的事物时要快得多。例如。他们开始加载稍后的元素 before 他们被要求。如果目标地址不遵循简单的模式,则此类预测会更加困难。
您链接的文章强调了标准委员会做出的设计选择,这些选择使 std::unordered_map
不适合作者的目的。他们写了一对 类 与 std::unordered_map
具有相同的 public 成员(含义相同),作为 "drop in" 的替代。
我很难理解this description of stl unordered map's implementation:
The standard template library (STL) for C++ provides hash tables via std::unordered_map and std::unordered_set. The standard guarantees reference stability: References and pointers to the keys and values in the hash table must remain valid until the corresponding key is removed. In practice, this means the entries must be indirect and individually allocated, which adds a substantial CPU overhead.
两个问题:
当作者说 "references and pointers to the keys and values ... must remain valid" 是不是意味着在我插入一个项目之后,指针和引用必须在整个程序中存在?当我使用 "new" 在堆上分配对象并且指向它的指针超出范围并且不再有效时。我不确定为什么 reference/pointer 需要保持有效,因为散列 table 引用了堆上的对象。
如何"indirect and individually allocated"条目"add substantial CPU overhead"?
When the author says "references and pointers to the keys and values ... must remain valid" does that mean that after I insert an item, the pointer and reference must live for the entirety of the program?
没有。这意味着,如果您获取映射中某个对象的地址,或将引用绑定到此类对象,则该指针或该引用不得因为添加或删除映射中不相关的元素而变得悬空。这是对 std::unordered_map
.
这与例如std::vector
行为举止。向向量中添加元素会导致它重新分配,并且之前获取的所有指针和对元素的引用都处于悬空状态。
When I use
new
to allocate the object on the heap and the pointer to it goes out of scope and is no longer valid.
不,该指针不复存在,其他具有相同值的指针仍指向您new
编辑的对象。
How do "indirect and individually allocated" entries "add substantial CPU overhead"?
现代 CPU 在访问内存中相邻的事物时要快得多。例如。他们开始加载稍后的元素 before 他们被要求。如果目标地址不遵循简单的模式,则此类预测会更加困难。
您链接的文章强调了标准委员会做出的设计选择,这些选择使 std::unordered_map
不适合作者的目的。他们写了一对 类 与 std::unordered_map
具有相同的 public 成员(含义相同),作为 "drop in" 的替代。