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

时间:2014-02-11 01:36:56

标签: c arrays computer-architecture

我对编程比较陌生,所以当有人建议构建一个结构数组(每个包含特定“item”的n个属性)比构建n个属性数组更快时,我发现我不知道足以让阵列以某种方式争论。

我读到了这个:

how do arrays work internally in c/c++

Basic Arrays Tutorial

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

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

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

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

3 个答案:

答案 0 :(得分: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;
}

可能是5.由于填充,也可能不是。

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

答案 1 :(得分:2)

您写道:

  

C程序是否足够智能,可根据数据类型和索引进行算术运算,以确定目标数据的确切内存地址

是的,这正是他们所做的。他们不会对介入的项目进行迭代(由于没有标记来指导每个项目的开始和结束,因此这样做无济于事。)

答案 2 :(得分:1)

所以这是整个技巧,数组元素在内存中相邻。

当您声明一个数组时,例如:int A[10];
变量A是指向数组中第一个元素的指针。

现在出现了索引部分,无论何时A[i],都与*(A+i)完全相同。

索引只是数组起始地址的偏移量,同时请记住,在指针算术中,偏移量乘以数组数据类型的大小。

为了更好地理解这个写一些代码,声明一个数组并打印它的地址,然后打印数组中的每个元素。 并注意偏移量总是相同,并且等于机器上数组的数据类型的大小。