2014-02-11 27 views
3

我对编程比较陌生,所以当有人建议构建一个结构数组(每个包含一个特定“item”的n个属性)比创建n个属性数组更快时,我发现我的知识不够关于数组来争论某种方式或另一种方式。C程序如何从内部数组中获取信息?

我这样说的:

how do arrays work internally in c/c++

Basic Arrays Tutorial

但我还是不真正了解一个C程序如何检索从指数的数组中的特定值。

看起来很清楚,数组的数据元素在内存中相邻存储,并且数组名称指向第一个元素。

C程序是否足够聪明,可以根据数据类型和索引来计算出目标数据的确切内存地址,或者程序是否必须以某种方式迭代每一个中间数据片段才能到达那里(如在链表数据结构中)?

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

+0

编译器是由人写的,人们足够聪明,可以处理数组运算 –

+0

很多使内存访问高效或低效的原因与缓存友好性有关:http://stackoverflow.com/questions/16699247/what -is-cache-friendly-code – happydave

回答

5

让我们举一个简单的例子。比方说,你有其在地址1000中存储这样的阵列int test[10]

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

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

baseaddr +的sizeof(型)*指数

一个结构的大小是其元素加上由编译器添加的任何填充的大小的简单相加。所以这个结构的大小:

struct test { 
    int i; 
    char c; 
} 

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

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

2

您写道:

是C程序足够聪明,做基于数据型和指数的算术找出目标数据

是确切的内存地址,即正是他们所做的。它们不会迭代干预项目(因为没有标记来指导每个项目的开始和结束,所以这样做不会有帮助。

+0

这很有道理! – user2127595

1

所以这里是整个把戏,一个数组元素在内存中相邻。

在声明例如数组:int A[10];
可变A是一个指针阵列中的第一个元素。

现在是索引的一部分,无论何时你做A[i]这就好像你在做*(A+i)

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

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

相关问题