Re: [問題] 不傾向使用std::vector的原因
http://codepad.org/jb4Gksbm
這隻小程式可以說明vector實際上使用記憶體的狀況
藏在vector底下的並非魔術
只是把普通的動態分配記憶體給包裝起來
省下自己手動管理的麻煩而已
當vector恰好持有4個元素大小的記憶體
而你又想要插入第五個元素時,vector內部會怎麼做呢?
vector做的事情很簡單
先向系統要一塊兩倍大的記憶體 (也就是8個元素大小的記憶體)
把舊元素複製過去,然後才插入第5個元素。
剩下未使用的三個元素的空間呢?
目前就閒置著,這樣下次插入新元素時,就不需要重新要求記憶體空間。
直到這8個元素的空間都用完了
vector又會幹一樣的事,要求兩倍大的空間,然後將元素複製過去。
所以vector的記憶體使用率會一直在50%~100%之間擺盪
一般來說這種程度的記憶體浪費只是小事,畢竟現在記憶體又大又便宜。
可是像OGRE這種對效能極端要求的圖學引擎
就曾經被詬病說因為使用了太多STL容器
所以用了太多超過真正需要的記憶體。
如其他版友說的,已知最大元素個數的話,
先用reserve()保留好空間,可以避免浪費。
另外就是跨語言溝通,比方說C#/Java呼叫使用C++ funciton
那基本上就一定要使用原生陣列了。
※ 引述《QHsin (Q馨)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: Linux VC++
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: C++ Standard Library(C++標準程式庫)
: C++ Standard Template Library (STL)
: 問題(Question):
: 這應該算是剛入行沒多久的菜鳥問題。
: 主要是工作到現在,常常看到一些class寧可自行管理動態陣列,
: 而不喜歡直接使用vector,其中的原因自己研究不太出來,
: 所以想問問是不是有一些業界的相關經驗,導致有什麼不適合使用vector的狀況發生。
: 1.首先我碰過前輩寫的(目前不在公司問不到)系統,
: 建立的類別以目的來說,本身沒有可能移植到無法使用STL的環境。
: 2.第二是排除掉class使用vector的時候,
: 好像要定義operator=還是複製用的建構子其一,
: 但就連一般的字串、整數、浮點數這些複製上沒問題變數,也是用動態陣列自行管理。
: 3.連window.h的一些綁平台的功能,
: 都使用到class裡面做一些主要的管理(WinProc之類的),
: 同樣是STL的std::map也用了不少次,唯獨就幾乎不用vector。
: 4.程式碼裡面,沒有什麼特別vector無法實現的特殊操作。
: 個人的觀察,大概的訊息就像上面那樣,不知道純粹只是個人習慣,
: 還是vector有些不太適用的地方,想了解一下,否則每次使用vector的時候都抖抖的orz
: 以上,請各位前輩指教。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.99.21.163
推
11/03 20:51, , 1F
11/03 20:51, 1F
→
11/03 20:51, , 2F
11/03 20:51, 2F
→
11/03 20:58, , 3F
11/03 20:58, 3F
→
11/03 20:58, , 4F
11/03 20:58, 4F
→
11/03 20:58, , 5F
11/03 20:58, 5F
→
11/03 21:00, , 6F
11/03 21:00, 6F
推
11/03 21:01, , 7F
11/03 21:01, 7F
→
11/03 21:05, , 8F
11/03 21:05, 8F
推
11/03 22:51, , 9F
11/03 22:51, 9F
→
11/03 22:51, , 10F
11/03 22:51, 10F
推
11/03 23:13, , 11F
11/03 23:13, 11F
→
11/04 14:02, , 12F
11/04 14:02, 12F
→
11/04 15:04, , 13F
11/04 15:04, 13F
→
11/04 15:22, , 14F
11/04 15:22, 14F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 5 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章