我对编程比较陌生,所以当有人建议构建一个结构数组(每个包含特定“item”的n个属性)比构建n个属性数组更快时,我发现我不知道足以让阵列以某种方式争论。
我读到了这个:
how do arrays work internally in c/c++
和
但我仍然不太了解C程序如何通过索引从数组中检索特定值。
很明显,数组的数据元素存储在内存中相邻,并且数组名称指向第一个元素。
C程序是否足够智能,可以根据数据类型和索引进行算术运算,以确定目标数据的确切内存地址,或者程序在到达之前必须以某种方式迭代每个中间数据(如在链表数据结构中)?
更重要的是,如果某个程序通过其内存地址请求一条信息,那么该机器如何找到它?
答案 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)
完全相同。
索引只是数组起始地址的偏移量,同时请记住,在指针算术中,偏移量乘以数组数据类型的大小。
为了更好地理解这个写一些代码,声明一个数组并打印它的地址,然后打印数组中的每个元素。 并注意偏移量总是相同,并且等于机器上数组的数据类型的大小。