1

memalignだけでなく、16Bを使用して2D配列(正方行列)を割り当てたいのですがmalloc

私は持っています

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

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

上記のコードを。で変更するにはどうすればよいですかmemalign

4

2 に答える 2

4

追加の 15 バイトを要求し、返されたポインタを最も近い 16 の倍数に切り上げるmalloc()必要があります。次に例を示します。

void* p = malloc(size + 15);
void* paligned;
if (!p) { /* handle errors */ }
paligned = (void*)(((size_t)p + 15) / 16 * 16);
/* use paligned */
free(p);
于 2012-09-26T07:13:53.947 に答える
2

ここにあるのは、実際には 2D マトリックスではなく、より多くの 1D 配列を指す 1D 配列です。

代わりにこのようなものが欲しいですか?

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

これにより、dim^2 要素の長さの 1D 配列が生成されます。これは、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;

于 2012-09-26T07:14:05.057 に答える