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

2024-03-29

int arr [] = {69, 1, 12, 10, 20, 113};

当我这样做时会发生什么

int x = a[3];

????

我一直有这样的印象a[3]意思是这样的:

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

但后来我对哈希表的工作原理感到困惑。因为如果哈希表被实现为“桶”数组(就像教授在本次讲座中所说的那样:https://www.youtube.com/watch?v=UPo-M8bzRrc https://www.youtube.com/watch?v=UPo-M8bzRrc),那么你还是要步行到你需要的桶;因此,它们的访问效率并不比数组高。

有人可以帮我解决这个问题吗?


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

+---------+-------+
| ADDRESS | VALUE |
+---------+-------+
|     ... |   ... |
+---------+-------+
|     100 |    69 |  <-- &arr[0] is 100
+---------+-------+
|     101 |     1 |
+---------+-------+
|     102 |    12 |
+---------+-------+
|     103 |    10 |  <-- &arr[3] is 103
+---------+-------+
|     104 |    20 |
+---------+-------+
|     105 |   113 |
+---------+-------+
|     ... |   ... |
+---------+-------+

我想强调的是,这是一个highly简化的模型,但它应该能让您了解正在发生的事情。你的计算机知道你的数组开始于,比方说地址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;
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐