动态2D数组C ++ 98 vs C ++ 11

时间:2014-04-03 05:28:35

标签: c++ arrays memory-management c++11

关注这个问题"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;

请你解释一下这些为二维动态数组分配内存的方法有什么区别?为什么以第一种方式逐行遍历数组并以第二种方式逐列遍历数组呢?

0 个答案:

没有答案