面试题答案
一键面试初始化代码
#include <iostream>
int main() {
int arr[2][3][4] = {
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
},
{
{13, 14, 15, 16},
{17, 18, 19, 20},
{21, 22, 23, 24}
}
};
return 0;
}
内存存储方式
在 C/C++ 中,多维数组在内存中是以行优先(Row-major order)的方式连续存储的。对于 int arr[2][3][4]
,先存储第一维的第一个元素,即 arr[0]
, arr[0]
本身又是一个二维数组 [3][4]
,这个二维数组同样按行优先存储。所以整个数组在内存中的存储顺序是:
arr[0][0][0]
arr[0][0][1]
...
arr[0][0][3]
arr[0][1][0]
...
arr[0][2][3]
arr[1][0][0]
...
arr[1][2][3]
对访问效率的影响
- 顺序访问:如果按内存存储顺序访问数组元素,即按行优先顺序访问,缓存命中率会比较高。现代计算机的缓存机制是基于局部性原理,当一个内存地址被访问时,附近的内存地址也很可能被访问。由于行优先存储使得相邻元素在内存中是连续的,所以顺序访问时,这些元素很可能已经被加载到缓存中,减少了内存访问次数,提高了访问效率。
- 随机访问:随机访问不同行或不同页的数据时,可能会导致缓存未命中。因为随机访问的元素在内存中可能相隔较远,不在同一个缓存块中,每次访问都可能需要从内存中重新加载数据,降低了访问效率。所以,在设计算法和数据结构时,尽量按行优先顺序访问多维数组,可以提高程序的性能。