RAM内存中的数据如何布局?
How data layout in RAM memory?
我有一个基于基础架构的问题。多维数组在内存中如何布局?内存中的数据线性布局是否正确?是这样吗,在基于行顺序的行主要顺序数据存储中(第一行存储,然后第二行...)和基于列的列主要数据存储是否正确?
谢谢
每个数组自然是按顺序存储的。把数据到处散布是没有意义的。
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 个不同的内存块,内存管理器可以自由地将它们分配到任何对它有意义的地方。
数组的表示取决于编程语言。大多数语言(C 流产及其后代是值得注意的例外)使用描述符表示数组。描述符指定了每个维度的上界和下界的维数,以及数据所在的位置。
通常,数组的所有数据都是连续存储的。即使连续存储,排序也取决于语言。在某些语言中,[0, 0, 0] 存储在 [1, 0, 0] 旁边(主要列 - 例如 FORTRAN))。在其他情况下,[0, 0, 0] 紧挨着 [0, 0, 1](并且 [0, 0, 0] 和 [1, 0, 0] 是分开的 - 主要行 - 例如,Pascal)。一些语言,例如 Ada,将排序留给编译器实现。
我有一个基于基础架构的问题。多维数组在内存中如何布局?内存中的数据线性布局是否正确?是这样吗,在基于行顺序的行主要顺序数据存储中(第一行存储,然后第二行...)和基于列的列主要数据存储是否正确?
谢谢
每个数组自然是按顺序存储的。把数据到处散布是没有意义的。
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 个不同的内存块,内存管理器可以自由地将它们分配到任何对它有意义的地方。
数组的表示取决于编程语言。大多数语言(C 流产及其后代是值得注意的例外)使用描述符表示数组。描述符指定了每个维度的上界和下界的维数,以及数据所在的位置。
通常,数组的所有数据都是连续存储的。即使连续存储,排序也取决于语言。在某些语言中,[0, 0, 0] 存储在 [1, 0, 0] 旁边(主要列 - 例如 FORTRAN))。在其他情况下,[0, 0, 0] 紧挨着 [0, 0, 1](并且 [0, 0, 0] 和 [1, 0, 0] 是分开的 - 主要行 - 例如,Pascal)。一些语言,例如 Ada,将排序留给编译器实现。