RAM内存中的数据布局如何?

时间:2016-04-16 17:14:55

标签: memory memory-management multidimensional-array store ram

我有一个基于架构的基本问题。多维数组如何在内存中布局?这是正确的数据布局在内存中线性吗?是这样,基于行顺序(第一行存储,然后是第二行......)和基于列的主要数据存储的行主要订单数据存储是否正确?

由于

2 个答案:

答案 0 :(得分:1)

自然地,每个数组按顺序存储。在整个地方传播数据毫无意义。

C:

中的示例
int matrix[10][10];
matrix[9][1] = 1234;
printf("%d\n", matrix[9][1]); // prints 1234
printf("%d\n", ((int*)matrix)[9 * 10 + 1]); // prints 1234

当然,没有什么可以强制你以这种方式组织数据,如果你想弄得一团糟,你可以做到。

例如,如果不是使用数组数组,而是决定动态分配矩阵:

int **matrix;
matrix = malloc(10 * sizeof(int*));
for (int i = 0; i < 10; ++i)
    matrix[i] = malloc(10 * sizeof(int));

上面的例子很可能仍然是按顺序存储的,但肯定不是以连续的方式存储,因为分配了11个不同的内存块,内存管理器可以随意分配它们。

答案 1 :(得分:1)

数组的表示取决于编程语言。大多数语言(C abortion及其后代是值得注意的例外)表示使用描述符的数组。描述符指定每个维度的上限和下限以及数据所在的维度数。

通常,数组的所有数据都是连续存储的。即使连续存储,顺序也取决于语言。在某些语言中,[0,0,0]存储在[1,0,0](Column Major-例如FORTRAN)旁边。在其他[0,0,0]紧挨着[0,0,1](并且[0,0,0]和[1,0,0]是分行主要 - 例如,Pascal)。某些语言(例如Ada)将排序留给编译器实现。