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

时间:2012-09-26 06:57:30

标签: c arrays allocation memory-alignment

我希望使用memalign和16B分配二维数组(方阵),而不是仅使用malloc

我有

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

    A[i] = (float*) malloc(sizeof(float)*(*dim));
}

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

2 个答案:

答案 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;