面试题答案
一键面试设计思路
- 内存连续性:为了提高缓存命中率,尽量按内存连续的方式访问数据。在 C/C++ 中,多维数组在内存中是按行优先存储的。所以按最内层维度优先遍历能保证内存连续性。
- 缓存命中率:减少缓存未命中的次数。将频繁访问的数据尽量放在缓存中。由于是对每个元素进行相同操作,所以连续访问数据能更好地利用缓存。
- 数据处理算法:使用指向四维数组的指针来操作数组,通过指针偏移来访问每个元素,这样可以避免复杂的数组下标计算,提高访问效率。
关键代码片段(以 C++ 为例)
#include <iostream>
#include <iomanip>
void processArray(double (*data)[200][300][400], int size1, int size2, int size3, int size4) {
for (int i = 0; i < size1; ++i) {
for (int j = 0; j < size2; ++j) {
for (int k = 0; k < size3; ++k) {
double *ptr = &data[i][j][k][0];
for (int l = 0; l < size4; ++l) {
*ptr += i + j + k + l;
++ptr;
}
}
}
}
}
int main() {
double data[100][200][300][400];
processArray(data, 100, 200, 300, 400);
// 可以在这里添加输出验证结果的代码,这里省略
return 0;
}
在上述代码中:
processArray
函数接受一个指向四维数组的指针以及各维度的大小。- 最外层循环遍历第一维
i
,次外层循环遍历第二维j
,第三层循环遍历第三维k
。 - 对于每一个
(i, j, k)
,通过指针ptr
指向data[i][j][k][0]
,然后通过指针偏移连续访问第四维l
的元素,这样能保证内存连续性,提高缓存命中率。 - 在
main
函数中,创建了一个四维数组并调用processArray
函数进行处理。