作者a3785lexx (Alex)
看板EE_DSnP
標題[請益] 兩個getMem裡的sizeof(size_t)...@@
時間Sat Nov 14 19:10:42 2009
如題...這個問題困擾我有點久了
在MemBlocks::getMem中還有在MemMgr::getMem中
TODO都有要求要make sure that t % SIZE_T == 0
但是我左思右想不得其解...
為甚麼t一定要是SIZE_T的倍數不可呢??
更精準的來說
我不懂的是
1.系統在new的時候所傳的參數size_t t是根據data member來決定的
正常情況下它有可能會不是SIZE_T的倍數嗎?
雖然我覺得應該是有可能,上課投影片的例子newOp.cpp就是一個的感覺@@
單一一個A的物件是12這麼大,可是size_t有8這麼大...orz
那麼,為甚麼在實作malloc的時候一定要t % SIZE_T == 0呢??
如果t不是SIZE_T的倍數會出甚麼問題嗎??
呃...等一下...我一邊打這篇請益文一邊想...難道說...
要求t一定要是SIZE_T的倍數是為了要能夠達到平台的相容性嗎??
雖然我還是不懂...以本次作業為例,obeject的data member都是char
char據說是可以一個Byte一個Byte的去吃記憶體的樣子?
如果不是以SIZE_T為單位去拿記憶體
丟給memTestObj用,就一定會出包,不管char的面子有多大嗎??
又,如果真的是系統所認定的物件大小size_t t
不會是實作記憶體的時候不會出包的大小SIZE_T的倍數
那麼我們多丟給這個物件的記憶體,系統會了解嗎??
就是它會知道這裡面有多給的不能用的部分嗎?
感覺起來有點毛毛的也......o.O
2.如果在new的時候系統丟的size_t t其實一定會是SIZE_T的倍數
(我記得上課的時候好像是這麼回事啊囧?
上課的時候去算一個物件的大小最後都會取tosizeT說orz)
也就是如果我剛剛腦包了,1.的問題根本不存在的話....囧
那麼,TODO裡的make sure....只是要我們assert它嗎XD?
順帶一提,free的過程只是把記憶體丟給recycleList紀錄而已
其實原本的object pointer還是可以去存取這個位置
這樣好恐怖的感覺@@"
尤其我試了一下...就算是內建的形態也是有這種情況
所以在外面寫的人只要一恍神還是會出很嚴重的問題...orz
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.43.108.164
※ 編輯: a3785lexx 來自: 114.37.106.93 (11/14 23:40)
1F:→ a3785lexx:難道建立統一的size_t標準只是為了可以完全用完每一個 11/15 00:20
2F:→ a3785lexx:memBlock而已嗎....剛剛突然想到的XDrz 11/15 00:20