[問題] 如何有效管理記憶體

看板C_and_CPP作者 (SaoAn)時間12年前 (2011/08/27 05:31), 編輯推噓5(5016)
留言21則, 6人參與, 最新討論串1/1
大家好, 小弟我有個記憶體管理的問題想請教大家 1. 現在的程式架構main.cpp int main(input) { //無任何記憶體配置 for(i=0;i<itercount;i++) { func1(input,something); func2(something); func3(something,output); } } func1~func3是很大的程式, 由不同人撰寫, 各自在開始時配置記憶體, 最後釋放記憶體 這樣有個問題就是浪費諸多時間在配置和釋放記憶體上, func1~func3有可能需要iterate 數次因此更增加這個架構的缺陷 2. 我因此想到一個稍微改良的架構 int main(input) { //無任何記憶體配置 func1_Initialize(); func2_Initialize(); func3_Initialize(); for(i=0;i<itercount;i++) { func1(input,something); func2(something); func3(something,output); } func1_Free(); func2_Free(); func3_Free(); } 這樣做的好處是記憶體只需要配置和釋放一次, 但是缺點是一次需要配置大量記憶體, 造成如果input image太大的話(記憶體大小都是根據image長寬), 記憶體會不夠, 其實就是func1~func3還是各自配至各自的記憶體, 可是事實上func1跑完裡面的記憶體 到下一次跑到func1之前都不會用到了, 造成浪費 3. 理想上但是不知道怎麼實做的架構 int main(input) { //配置一大團記憶體, 大小都跟input image長寬相等 malloc mem1, mem2....mem100; for(i=0;i<itercount;i++) { func1(input,something,mem1~mem50); func2(something,mem1~mem98); func3(something,mem1~mem37,output); } free mem1~mem100; } 由Main統一配置和釋放記憶體, 然後看各個function需要多少予以配給, 請問實做上該 如何寫比較對呢? 總不會一個function要有快100個左右的input吧...? 小弟先謝謝大家了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 128.54.5.185

08/27 06:00, , 1F
你的理想上的3跟2不也一樣,都是一次配置大量記憶體
08/27 06:00, 1F

08/27 06:00, , 2F
都是全部跑完才一次釋放,缺點都一樣
08/27 06:00, 2F

08/27 06:05, , 3F
就用 union 那套,假設: f1 要10坪, f2 要15坪, f3 要12坪
08/27 06:05, 3F

08/27 06:06, , 4F
就蓋(malloc)一個15坪(Bytes),給唯一門口(pointer)
08/27 06:06, 4F

08/27 06:07, , 5F
大家進去刷油漆 (寫入資料),不用管原本的顏色 (內容)
08/27 06:07, 5F

08/27 06:47, , 6F
2的話要50+98+37, 3就只要100, 問題是3該如何實做?
08/27 06:47, 6F

08/27 11:42, , 7F
想到的是一開始配置一塊三個函式都足以使用的記憶體
08/27 11:42, 7F

08/27 11:42, , 8F
當作參數傳進去使用。等全部都用完了再一口氣釋放掉
08/27 11:42, 8F

08/27 11:47, , 9F
這樣子不就跟第一個方法一樣,要用在配置,用完釋放
08/27 11:47, 9F

08/27 12:00, , 10F

08/27 13:15, , 11F
原來是我誤會意思了,這真是個好方法
08/27 13:15, 11F

08/27 13:46, , 12F
這樣真的會快很多嗎?
08/27 13:46, 12F

08/27 15:02, , 13F
看起來會比較快,但快多少就不知道了
08/27 15:02, 13F

08/27 21:37, , 14F
謝謝james732大
08/27 21:37, 14F

08/27 22:18, , 15F
我想請教原 po 第三點原意為何?是否為記憶體共用之意?
08/27 22:18, 15F

08/27 22:25, , 16F
我猜原po第三點是不知道要怎麼把那一塊塊記憶體傳入函式
08/27 22:25, 16F

08/27 22:26, , 17F
嗯,我以為,原po每層iterator都會改變記憶體需求量,
08/27 22:26, 17F

08/27 22:26, , 18F
看來似乎不是..
08/27 22:26, 18F

08/27 22:27, , 19F
看起來沒那麼複雜,只是三個函式不同,但每次應是固定的
08/27 22:27, 19F

08/27 22:28, , 20F
感謝 j 大翻譯/解釋
08/27 22:28, 20F

08/27 22:32, , 21F
其實我也不知道自己猜的對不對啦 XD
08/27 22:32, 21F
文章代碼(AID): #1EM13Evn (C_and_CPP)