[已解] allocate memory for 3 dim.
我想做的是避開 malloc / new 碎片化問題,
雖然已用其中一種方式做出來,
但在想是不是我觀念不正確,所以另一種方式做不出來,
有問題的碼如下 http://codepad.org/eNVzkv1V
用到的概念如下。
變數假設如下。
int *space1d, **space2d, ***space3d;
const size_t x=2, y=3, z=4 ;
以 2d 為例,目前有二種作法,
2d-1 (malloc / free 2 次)
/* allocate */
space1d = (int*)malloc(sizeof(int) * x * y);
space2d = (int**)malloc(sizeof(int*)* x );
for(i=0; i<x; ++i)
space2d[i]=space1d, space1d+=y;
/* release */
free((void*)(*space2d));
free((void*)space2d);
2d-2 (malloc / free 1 次)
/* allocate */
space2d = (int **)malloc(sizeof(int*)*x + sizeof(int)*x*y);
space1d = (int *)(space2d + x);
for(i=0; i<x; ++i){
space2d[i] = space1d;
space1d+=y;
}
/* release */
free(space2d);
再以 3d 為例時
3d-1(malloc / free 3 次)
/* allocate */
space1d = (int*)malloc(sizeof(int) * x * y * z);
space2d = (int**)malloc(sizeof(int*) * x * y);
space3d = (int***)malloc(sizeof(int**) * x);
for(i=0; i<x; ++i){
space3d [i] = space2d;
for(j=0; j<y; ++j){
space2d[j] = (int*)space1d;
space1d+=z;
}
space2d+=y;
}
/* release */
free((void*)**space3d);
free((void*)*space3d);
free((void*)space3d);
3d-2(malloc / free 1 次)
/* allocate */
space3d = (int ***)malloc(sizeof(int**)*x +
sizeof(int*)*x*y +
sizeof(int)*x*y*z);
space2d = (int**)(space3d + x);
space1d = (int*)(space2d + x*y );
for(i=0; i<x; ++i){ // 實體資料
space3d[i] = space2d;
for(j=0; j<y; ++j){
space2d[j] = space1d;
space1d+=z;
}
space2d+=y;
}
/* release */
free(space3d);
目前想要把上面的動作全都包成各函式,宣告如下。
void** new2d(const size_t X, const size_t Y, const size_t SizeOfEle);
void*** new3d(const size_t X, const size_t Y, const size_t Z,
const size_t SizeOfEle);
目前完成之進度如下 (沒問題的部份就不附上 code 了, 有需求的可推文, 再附上)
2d-1 (malloc 2 次) pass
2d-2 (malloc 1 次) pass
3d-1 (malloc 3 次) fail http://codepad.org/eNVzkv1V
3d-2 (malloc 1 次) pass
問題在於 3d-1 那裡,我包的 function 似乎必然會產生二個衝突問題:
(1) 對 space2d 必然產生 memory leak
(2) 或對 space2d 會產生重覆 free ?
硬要用這方式完成的話,是否有改善空間?
或 O( #dim ) 之 malloc 方式要包 func, 不適合用在高維度上?
先謝謝各位不吝指教!!
--
我知道 ~ 但別說出來 ,
說出來讓人感到特別難過...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.161
→
03/24 22:27, , 1F
03/24 22:27, 1F
→
03/24 22:31, , 2F
03/24 22:31, 2F
※ 編輯: tropical72 來自: 180.177.76.161 (03/24 22:37)
→
03/24 22:56, , 3F
03/24 22:56, 3F
→
03/24 22:57, , 4F
03/24 22:57, 4F
→
03/24 23:01, , 5F
03/24 23:01, 5F
→
03/24 23:09, , 6F
03/24 23:09, 6F
→
03/24 23:10, , 7F
03/24 23:10, 7F
→
03/24 23:10, , 8F
03/24 23:10, 8F
→
03/24 23:11, , 9F
03/24 23:11, 9F
→
03/24 23:14, , 10F
03/24 23:14, 10F
→
03/25 00:56, , 11F
03/25 00:56, 11F
→
03/25 01:22, , 12F
03/25 01:22, 12F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):