C++ 动态和经典多维阵列的速度差

C++ 动态和经典多维阵列的速度差,c++,arrays,multidimensional-array,C++,Arrays,Multidimensional Array,动态多维数组和经典多维数组的使用(而非创建)速度在速度方面是否有所不同 我的意思是,例如,当我试图通过循环访问三维数组中的所有值时,作为动态方法和经典方法创建的数组之间是否存在速度差异 当我说“动态三维阵列”时,我的意思是矩阵[kuanta][d][angle\u scale]是这样创建的 matris_cos = new float**[kuanta]; for (int i = 0; i < kuanta; ++i) { matris_cos[i] = new float*[d];

动态多维数组和经典多维数组的使用(而非创建)速度在速度方面是否有所不同

我的意思是,例如,当我试图通过循环访问三维数组中的所有值时,作为动态方法和经典方法创建的数组之间是否存在速度差异

当我说“动态三维阵列”时,我的意思是矩阵[kuanta][d][angle\u scale]是这样创建的

matris_cos = new float**[kuanta];
for (int i = 0; i < kuanta; ++i) {
  matris_cos[i] = new float*[d];

  for (int j = 0; j < d; ++j)
    matris_cos[i][j] = new float[angle_scale];
}
float matris_cos[kuanta][d][angle_scale];

但请注意,我并不要求这些数组的创建速度。我想通过一些循环来访问这些数组的值。当我尝试访问这些值时,是否存在速度差异。

在典型的应用程序中,您将无法发现它们之间的任何差异,除非您的数组非常大,并且您花费了大量时间读取/写入它们,但尽管如此,还是存在差异

float matris_cos[kuanta][d][angle_scale];
1) 此多维数组的内存将是连续的。因此,将减少缓存未命中。
2) 数组将只需要浮动本身的空间

matris_cos = new float**[kuanta];
for (int i = 0; i < kuanta; ++i) {
    matris_cos[i] = new float*[d];

    for (int j = 0; j < d; ++j)
        matris_cos[i][j] = new float[angle_scale];
}
matris_cos=新浮动**[kuanta];
对于(int i=0;i
1) 这个多维数组的内存是按块分配的,因此不太可能是连续的。这可能会导致缓存未命中。
2) 此方法需要指针和浮点本身的空间

matris_cos = new float**[kuanta];
for (int i = 0; i < kuanta; ++i) {
    matris_cos[i] = new float*[d];

    for (int j = 0; j < d; ++j)
        matris_cos[i][j] = new float[angle_scale];
}
由于在第二种情况下存在间接性,因此在尝试访问或更改值时,可以预期速度会有微小的差异

重述:

  • 第二种情况使用更多内存
  • 第二种情况涉及间接性
  • 第二种情况没有保证的缓存位置
指针数组(指向指针数组)需要额外的间接级别才能访问随机元素,而多维数组则需要基本的算术运算(乘法和指针加法)。在大多数现代平台上,除非使用缓存友好的访问模式,否则间接寻址可能会较慢。此外,多维数组的所有元素都是连续的,如果迭代整个数组,这有助于缓存

这种差异是否可以测量,只能通过测量来判断

如果额外的间接性确实被证明是一个瓶颈,则可以用类替换指针数组,以平面数组表示多维数组:

class array_3d {
    size_t d1,d2,d3;
    std::vector<float> flat;

public:
    array_3d(size_t d1, size_t d2, size_t d3) : 
        d1(d1), d2(d2), d3(d3), flat(d1*d2*d3) 
    {}

    float & operator()(size_t x, size_t y, size_t z) {
        return flat[x*d2*d3 + y*d3 + z];
    }
    // and a similar const overload
};
类数组\u 3d{
尺寸为d1、d2、d3;
std::向量平坦;
公众:
阵列3d(尺寸d1、尺寸d2、尺寸d3):
首被告(首被告)、次被告(次被告)、第三被告(第三被告)、平被告(首被告*次被告*第三被告)
{}
浮点运算符()(大小x,大小y,大小z){
返回平面[x*d2*d3+y*d3+z];
}
//和一个类似的常量重载
};

我相信下一个C++标准(明年到期)将包括动态大小的数组,因此在所有情况下都应该使用多维表。< /P>创建两个程序,每个程序一个,并对它们进行基准测试。我怀疑你会发现任何差异。你需要大量的数据来发现这种差异。顺便说一下,多维数组通常以行主格式或列主格式存储