如何动态分配16B对齐的2d数组

我想使用memalign和16B分配2D数组(方阵),而不是仅使用malloc

我有

 A =(float **) malloc( (*dim) * sizeof(float*)); for ( i = 0 ; i < (*dim) ; i++) { A[i] = (float*) malloc(sizeof(float)*(*dim)); } 

如何用memalign更改上面的代码。

使用malloc()您需要请求15个额外字节,然后将返回的指针向上舍入到最接近的16的倍数,例如:

 void* p = malloc(size + 15); void* paligned; if (!p) { /* handle errors */ } paligned = (void*)(((size_t)p + 15) / 16 * 16); /* use paligned */ free(p); 

你在这里所拥有的并不是一个2D矩阵,只是一个指向更多1Darrays的1Darrays。

你想要这样的东西吗?

 A = (float*) memalign(16, (*dim) * (*dim) * sizeof(float)); 

这将生成一个1D数组,其长度为dim ^ 2个元素。 这就是2D数组通常在C / C ++中使用的方式(除非您有特定的理由使用指向其他数组的指针数组)。

我假设您希望将此数组提供给某些DSP函数 – 如果不知道您尝试使用的函数,很难知道更多。

如果您必须以A [x] [y]访问数组,则可以执行以下操作:

 float *aMemory = (float*) memalign(16, (*dim) * (*dim)); float **A = (float**) malloc(*dim * sizeof(float)); for (i = 0; i < *dim; i++) { A[i] = &aMemory[*dim * i]; } 

现在,您可以通过指针数组A访问数组aMemory

 // A[row][column] A[0][0] = 0.0f; A[1][1] = 1.0f; 

等等