gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:46 25 4
gpt4 key购买 nike

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

当我这样做时会发生什么

int x = a[3];

????

我一直觉得 a[3] 的意思是这样的:

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

但后来我对哈希表的工作原理感到困惑。因为如果将哈希表实现为“桶”数组(就像教授在本次讲座中所说: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 |
+---------+-------+
| ... | ... |
+---------+-------+

我想强调的是,这是一个高度简化的模型,但它应该能让您了解正在发生的事情。您的计算机知道您的数组从 address 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 个地址)。

关于c++ - 当我访问数组的元素时,硬件级别会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26898068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com