我希望使用memalign
和16B分配二维数组(方阵),而不是仅使用malloc
。
我有
A =(float **) malloc( (*dim) * sizeof(float*));
for ( i = 0 ; i < (*dim) ; i++) {
A[i] = (float*) malloc(sizeof(float)*(*dim));
}
如何使用memalign
更改上面的代码。
答案 0 :(得分:4)
使用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);
答案 1 :(得分:2)
你在这里所拥有的并不是一个二维矩阵,只是一个指向更多一维阵列的一维数组。
你想要这样的东西吗?
A = (float*) memalign(16, (*dim) * (*dim) * sizeof(float));
这将生成一个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;
等