C++ 动态和经典多维阵列的速度差
动态多维数组和经典多维数组的使用(而非创建)速度在速度方面是否有所不同 我的意思是,例如,当我试图通过循环访问三维数组中的所有值时,作为动态方法和经典方法创建的数组之间是否存在速度差异 当我说“动态三维阵列”时,我的意思是矩阵[kuanta][d][angle\u scale]是这样创建的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];
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>创建两个程序,每个程序一个,并对它们进行基准测试。我怀疑你会发现任何差异。你需要大量的数据来发现这种差异。顺便说一下,多维数组通常以行主格式或列主格式存储