C++:关于"valid pointers and references"的澄清
C++: Clarification about "valid pointers and references"
我很难理解对stl无序列图实现的描述:
用于C++的标准模板库 (STL) 通过 std::unordered_map 和 std::unordered_set 提供哈希表。该标准保证了引用的稳定性:在删除相应的键之前,对哈希表中的键和值的引用和指针必须保持有效。实际上,这意味着条目必须是间接的和单独分配的,这会增加大量的 CPU 开销。
两个问题:
-
当作者说"引用和指向键和值的指针......必须保持有效"这是否意味着在我插入项目后,指针和引用必须在整个程序中存在?当我使用"new"在堆上分配对象并且指向它的指针超出范围并且不再有效时。我不确定为什么引用/指针需要保持有效,因为哈希表引用了堆上的对象。
"> 间接和单独分配"条目如何"增加大量 CPU 开销"?
当作者说"引用和指向键和值的指针......必须保持有效"这是否意味着在我插入项目后,指针和引用必须在整个程序中存在?
不。这意味着,如果您获取映射中某个对象的地址,或绑定对此类对象的引用,则该指针或该引用不得因为添加或删除映射中的不相关元素而变得悬而未决。这是对实施std::unordered_map
的要求。
这与例如std::vector
行为。向向量添加元素可能会导致它重新分配,并且所有以前获取的指针和对元素的引用都悬而未决。
当我使用
new
在堆上分配对象并且指向它的指针超出范围并且不再有效时。
不,指针不复存在,其他具有相同值的指针仍指向您new
编辑的对象。
间接和单独分配"条目如何"增加大量 CPU 开销"?
现代 CPU 在访问内存中相邻的东西方面要快得多。 例如,它们在被要求之前开始加载后面的元素。如果目标地址不遵循简单的模式,则这种预测会更难。
您链接的文章重点介绍了标准委员会所做的设计选择,这些选择使std::unordered_map
不适合作者的目的。他们编写了一对与std::unordered_map
具有相同公共成员(具有相同含义)的类,作为"插入式"替换。
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- 如何使用 std::sort with pair and references
- C++:关于"valid pointers and references"的澄清
- c++ static_cast and references
- 为什么这给了我"Undefined references to constructors and destructors"?
- 使用C++"How in list all iterators and references unaffected after any operation"的后端过程
- Rvalue references and std::forward