[問題] 關於vector的一些 記憶體相關問題

看板C_and_CPP (C/C++)作者 (angelaa)時間14年前 (2011/08/31 01:42), 編輯推噓4(4026)
留言30則, 11人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) openCV 問題(Question): 假設 我宣告 vector< float > vec; for(int i = 0 ; i < 5 ; ++i) vec[ i ] = i ; 這時候 所擁有的資訊應該是 address . size(還有嗎?)以及內容資料 0 1 2 3 4 想請問的是 這些東西應該存放在哪邊呢? stack ? 記憶體? 還是在哪邊? 會問這問題是因為 我的程式因為有非常多的資料要做運算 很怕會因為stack滿了 導致計算錯誤 因為我目前就遇到了一些問題 所以想問一下各位大大 這些資料在電腦裡是如何擺放的 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.169.180.214

08/31 01:45, , 1F
內容資料在動態記憶體區塊, size,指標在stack中
08/31 01:45, 1F

08/31 01:51, , 2F
內容資料通常是放在heap裡
08/31 01:51, 2F
heap 應該是看記憶體多大 就有多大容量吧!? 不確定有沒有記錯? ※ 編輯: abc01251 來自: 1.169.180.214 (08/31 01:53)

08/31 02:05, , 3F
windows 下,process 可使用 heap 應是看 os 版本.
08/31 02:05, 3F

08/31 02:05, , 4F
http://0rz.tw/0fEfI 沒記錯應是看 user mode 多大.
08/31 02:05, 4F

08/31 02:10, , 5F
vector<float> *vec = new vector<float>;
08/31 02:10, 5F

08/31 02:11, , 6F
這樣除了指標vec在stack上,其他東西都會在heap上 (吧?)
08/31 02:11, 6F

08/31 02:13, , 7F
stack滿了不會計算錯誤,會讓程式錯誤
08/31 02:13, 7F

08/31 02:17, , 8F
http://0rz.tw/B4Alc 3F, 8F 值得一看。
08/31 02:17, 8F
謝謝 我剛剛看過 受益良多~~ 至於我的BUG 只好再找找哪邊錯誤囉 謝謝^^ ※ 編輯: abc01251 來自: 114.25.191.63 (08/31 03:35)

08/31 04:13, , 9F
我還是建議你先算一下你的程式會吃多少記憶體,
08/31 04:13, 9F

08/31 04:14, , 10F
vector 是方便管理記憶體沒錯,但它也可能會配置失敗
08/31 04:14, 10F

08/31 04:14, , 11F
08/31 04:14, 11F

08/31 08:59, , 12F
vector是用malloc和realloc去實作的,所以他的內容是放在
08/31 08:59, 12F

08/31 09:02, , 13F
heap.只是他有建構子和解構子幫忙.可以模擬array在stack
08/31 09:02, 13F

08/31 09:04, , 14F
區塊.因此vector離開宣告的區塊時,資源就釋放了.
08/31 09:04, 14F

08/31 09:18, , 15F
~"~又不小心C的觀點看東西,把malloc和realloc改成new
08/31 09:18, 15F

08/31 09:24, , 16F
和allocate
08/31 09:24, 16F

08/31 10:27, , 17F
vector不一定是用malloc也不一定是用new
08/31 10:27, 17F

08/31 10:28, , 18F
它的記憶體配置方法可以由使用者自行決定
08/31 10:28, 18F

08/31 11:17, , 19F
謝謝littleshan導正
08/31 11:17, 19F
再請教一個問題 每當我宣告一個vector的時候 debug mode 跟 Realease mode Compiler分別在stack裡面佔了多少記憶體? ※ 編輯: abc01251 來自: 114.25.191.63 (08/31 12:46)

08/31 12:49, , 20F
compiler 不會去佔你那小得可憐的 stack...去用sizeof()查
08/31 12:49, 20F

08/31 12:50, , 21F
0, 因為Compiler不存在你的程式裡 ( ′-`)y-~
08/31 12:50, 21F

08/31 13:01, , 22F
版主..
08/31 13:01, 22F

08/31 13:58, , 23F
查這大小真的沒意義,且compiler實做、實測不一樣.
08/31 13:58, 23F

08/31 13:59, , 24F
大量的東西放到heap,接下來要stack爆似乎也不容易了吧?
08/31 13:59, 24F

08/31 14:03, , 25F
再補一下,VC6/VC2008,debug/release, DEV-C 測都不一樣
08/31 14:03, 25F
抓到問題了~~stack沒有錯 問題出在我的參考亂了~"~ 想請問一下各位 這應該怎麼解決@@? 問題大概是 int i = 1 , j = 2; int &pi = i , &pj = j ; << 因為原本是多層的 struct 所以用這種方法 問題是出在這邊 if(條件成立){ 我想把pi指向j pj 指向i pi = j; pj = i; } 但是 因為pi=j時 已經把 i也改掉了 所以造成錯誤 想請問一下 有甚麼辦法可以改呢? 目的地 簡單來說 就是要把兩個交換 但是一直無解要怎樣做才能達到目的 並且同時使用pi pj 這樣的簡化寫法~ ※ 編輯: abc01251 來自: 140.113.149.219 (08/31 17:57)

08/31 17:59, , 26F
交換的話應該要多一個暫時變數吧?
08/31 17:59, 26F

08/31 18:00, , 27F
交換a, b 就是 int t = a; a = b; b = t; 之類的寫法
08/31 18:00, 27F

08/31 18:09, , 28F
C++ 的參考不能重新定向吧, 請用指標
08/31 18:09, 28F
恩 我試試看 ※ 編輯: abc01251 來自: 140.113.149.219 (08/31 18:14)

08/31 19:11, , 29F
我記得algorithm裡有swap吧..
08/31 19:11, 29F
文章代碼(AID): #1ENI4N8i (C_and_CPP)
文章代碼(AID): #1ENI4N8i (C_and_CPP)