看板 EE_DSnP 關於我們 聯絡資訊
如題...這個問題困擾我有點久了 在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)
a3785lexx:難道建立統一的size_t標準只是為了可以完全用完每一個 11/15 00:20
a3785lexx:memBlock而已嗎....剛剛突然想到的XDrz 11/15 00:20