Re: [STL ] 2D 記憶體初始的問題
※ 引述《Renell (開卷有益)》之銘言:
: ※ 引述《Renell (開卷有益)》之銘言:
: : 我使用兩種矩陣宣告的方法
: : 發現使用STL的vector記憶體宣告的很慢><
: : 有什麼特別的方法可以改善的嗎??
: : int Row,Col; Row = 5000; Col = 8000;
: : // Case 1
: : int** a1;
: : a1 = new int*[Row];
: : for(int i=0;i<Row;i++){ a1[i] = new int[Col]; }
: : // case 2
: : vector< vector<int> > a2(Row,vector<int>(Col));
: :--
: :◆ From: 220.139.128.121
: :推 PwiPwiWorm:case2寫法有問題,會有許多不必要的copy,請參考版上寫法 04/07 11:56
: :推 babyghost:建議case2 使用vector< vector<int>* > 04/07 13:03
: 可否進一步指示怎麼使用vector< vector<int>* >宣告呢?
: 使用這個方法,記憶體會連續嘛??
有什麼情況會需要用到容量 40 M 的矩陣?重新考慮一下你的設計,
說不定用個 multimap 之類的就可以解決問題。
vector< vector<int> > 會慢是因為產生太多暫時物件,而且它還對
每個 Row 的每個 Col 作了兩次初始化(一次把暫時物件設為 0,一
次把暫時物件的 0 複制過去)的動作。
不建議用 vector< vector<int>* > 的寫法,用 vector 主要的兩個
優點是延伸性和自動內存管理。但此案例中,第一個好處你不需要,
第二個好處你享受不到(還是得自己配置自己釋放內存),所以不如
直接手動配置。
vector 比手動配置慢也只有在初始的時候。如果不能忍受這點的話,
就自己手動配置算了。可以參考精華區中,動態 2D Array 的使用方
法,其中初始化最快的應該是以一維陣列來模擬(第四種),因為內
存是連續的,至於 boost::multi_array (最後一種)我沒測過效能,
不過你可以試試看,說不定它初始也夠快。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.214.120
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章