C程序如何从内部从数组中获取信息?

use*_*595 3 c arrays computer-architecture

我对编程比较陌生,所以当有人建议构建一个结构数组(每个包含特定"item"的n个属性)比构建n个属性数组更快时,我发现我对数组知之甚少以某种方式争论.

我看了这个:

数组如何在c/c ++中内部工作

基本阵列教程

但我仍然不太了解C程序如何通过索引从数组中检索特定值.

很明显,数组的数据元素存储在内存中相邻,并且数组名称指向第一个元素.

C程序是否足够聪明,可以根据数据类型和索引进行算术运算,以确定目标数据的确切内存地址,或者程序是否必须以某种方式迭代每个中间数据到达之前(如链表数据结构)?

更重要的是,如果程序通过其内存地址请求一条信息,那么机器如何找到它?

Lin*_*ios 5

我们来看一个更简单的例子.假设你有一个数组int test[10],这个数据存储在地址1000:

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10

编译器知道,例如,int是4个字节.数组访问公式是这样的:

baseaddr + sizeof(type)*index

结构的大小只是其元素大小加上编译器添加的任何填充的总和.所以这个结构的大小:

struct test {
  int i;
  char c;
}
Run Code Online (Sandbox Code Playgroud)

可能是5.它也可能不是,因为填充.

至于你的上一个问题,很快(这是非常复杂的)MMU使用页面表将虚拟地址转换为物理地址,然后请求该物理地址,如果它在缓存中,则返回,否则从主要地址获取记忆.