C++中的2D动态分配,使用带有空间局部性的New



我很抱歉问了一个基本问题,但我真的找不到合适的答案。我继承了一个C++代码,其中的一部分具有以下形式的2D分配函数Allocate2D

float** Allocate2D(long long sizeX, long long sizeY)
{
float** p = new float*[sizeY];
p[0] = new float[sizeX*sizeY];
for (long long z = 0; z < sizeY; z++) {
p[z] = p[0] + z * sizeX;
}
return ptr;
}
int main(){
long long nX = ... ; 
long long nY = ... ; 
short** A = (short **)Allocate2D(nX, nY);
// do stuff with A ...
}

我有两个问题:

1-Allocate2D是否正在创建大小为sizeXxsizeY的2D阵列?

2-当为float**定义Allocate2d时,分配2Dshort阵列(如A(是否为常见/合法/良好做法?

  1. 是。这确实取决于你所说的";2D阵列";。创建用于存储按二维索引的数据的数据结构的方法不止一种。可以像在A[y][x]中那样,用二维解引用A,它将按预期工作。此外,A[0]中将有一个指针指向sizeX x sizeY浮点的连续数组,其中x维度变化最快。这是使用float B[sizeY][sizeX]也会得到的内存布局。然而,AB的类型(忽略float和short(并不相同。A是指向指针数组的指针,而B衰减为指向浮点的指针。

  2. 没有。将指针强制转换为指向其他类型是不合法的。它打破了指针别名规则。此外,由于sizeof(float)几乎肯定不等于sizeof(short),所以阵列的大小将是错误的,即它将是nX*2 × nY。然而,由于float*从未被解引用为float,我们可以清楚地看到,浮点指针的寿命非常有限,因此实际上不会有问题。

所以这是可行的,除了数组是它应该的两倍大。但是将浮点指针变成短指针并不是严格合法的,而且很难看。编写一个正确类型的函数模板会更好,也更容易。

最新更新