当我访问数组的元素时,在硬件级别会发生什么?

5 c++ arrays hashtable

int arr [] = {69, 1, 12, 10, 20, 113};
Run Code Online (Sandbox Code Playgroud)

当我做的时候会发生什么

int x = a[3];
Run Code Online (Sandbox Code Playgroud)

????

我总是觉得这a[3]意味着:

从内存地址开始arr。向前走3个内存地址。获取该内存地址表示的整数。

但是后来我对哈希表如何工作感到困惑。因为如果将哈希表实现为“存储桶”的数组(如教授在本讲座中所说:https : //www.youtube.com/watch?v= UPo- M8bzRrc),那么您仍然必须走到存储桶你需要; 因此,它们的访问效率不比数组高。

有人可以帮我清理一下吗?

Jul*_*ian 4

将内存想象成一个大的两列表表:

+---------+-------+
| ADDRESS | VALUE |
+---------+-------+
|     ... |   ... |
+---------+-------+
|     100 |    69 |  <-- &arr[0] is 100
+---------+-------+
|     101 |     1 |
+---------+-------+
|     102 |    12 |
+---------+-------+
|     103 |    10 |  <-- &arr[3] is 103
+---------+-------+
|     104 |    20 |
+---------+-------+
|     105 |   113 |
+---------+-------+
|     ... |   ... |
+---------+-------+
Run Code Online (Sandbox Code Playgroud)

我想强调的是,这是一个高度简化的模型,但它应该能让您了解正在发生的事情。您的计算机知道您的数组从地址 100开始。而且,由于给定数组中的所有元素大小相同,因此您可以通过在起始地址上添加 +3 来轻松访问数组的第三个元素。计算机不需要“走到”数组的第三个元素,它只是获取存储在内存地址100 + 3处的值。

如果您想查看实际的示例,请编译并运行以下代码:

#include <iostream>
using namespace std;

int main() {
    int a[] = { 1, 2, 3 };
    cout << "Address of a:\t\t" << &a[0] << endl;
    cout << "Address of a[2]:\t" << &a[2] << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

记下a的地址。假设您的计算机使用 32 位整数,您应该看到a[2]的地址只是a + 2*4的地址。它添加 2*4 而不仅仅是 2 的原因是因为每个整数实际上使用 4 个字节的内存(即单个值将跨越 4 个地址)。