关注这个问题"What is “cache-friendly” code?"我创建了动态二维数组,以检查按行逐列和逐行访问元素所需的时间。
当我按以下方式创建数组时:
const int len = 10000;
int **mass = new int*[len];
for (int i = 0; i < len; ++i)
{
mass[i] = new int[len];
}
以行为单位遍历此数组需要0.239秒,逐列遍历1.851秒(在发布中)。
但是当我以这种方式创建一个数组时:
auto mass = new int[len][len];
我得到一个相反的结果:0.204秒以逐行遍历此阵列并以0.088秒逐列遍历。
我的代码:
const int len = 10000;
int **mass = new int*[len];
for (int i = 0; i < len; ++i)
{
mass[i] = new int[len];
}
// auto mass = new int[len][len]; // C++11 style
begin = std::clock();
for (int i = 0; i < len; ++i)
{
for (int j = 0; j < len; ++j)
{
mass[i][j] = i + j;
}
}
end = std::clock();
std::cout << "[i][j] " << static_cast<float>(end - begin) / 1000 << std::endl;
begin = std::clock();
for (int i = 0; i < len; ++i)
{
for (int j = 0; j < len; ++j)
{
mass[j][i] = i + j;
}
}
end = std::clock();
std::cout << "[j][i] " << static_cast<float>(end - begin) / 1000 << std::endl;
请你解释一下这些为二维动态数组分配内存的方法有什么区别?为什么以第一种方式逐行遍历数组并以第二种方式逐列遍历数组呢?