2012-09-26 91 views
1

我想分配二維數組(矩陣)使用memalign與16B而不是僅使用malloc如何動態分配16B對齊的二維數組

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

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

我如何可以改變上面memalign代碼。

回答

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); 
+0

尼斯,獨立於平臺的答案 –

2

你在這裏什麼也算不上一個二維矩陣,只是一維數組指向更多的一維數組。

你想要這樣的東西嗎?

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

這將生成一個暗淡^ 2個元素長的一維數組。這就是二維數組通常在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的數組訪問數組å存儲,如

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

+0

我試圖做矩陣轉置的方形矩陣/ 5點型板/ matirx乘法,我想用內部函數的數組n eeds被調整。 – kiki

+0

也許你應該問一個特定於你正在使用的函數的問題,你可能會得到更多有用的信息:)我不確定你的內在函數是什麼意思。我甚至不知道你使用的是什麼平臺/編譯器/等等。 –

+0

如果我聲明它爲float *,其大小爲dim^2,那麼我是否可以訪問帶有2個索引的數組?例如,即使A被聲明爲float *,我仍然可以執行A [x] [y]嗎? – kiki