EE_DSnP 板


LINE

※ 引述《a3785lexx (Alex)》之銘言: : 如題...這個問題困擾我有點久了 : 在MemBlocks::getMem中還有在MemMgr::getMem中 : TODO都有要求要make sure that t % SIZE_T == 0 : 但是我左思右想不得其解... : 為甚麼t一定要是SIZE_T的倍數不可呢?? 因為當你 new 一個變數時,他所指到的記憶體的位置一定是與 SIZE_T 的倍數對齊的, 也就是說,對 32/64 位元的電腦而言,此 memory address 一定是 4/8 的倍數. 你可以試試看,不要用自己的 memory mgr, 就用系統的 new & new [], 無論你寫怎麼樣的 new xxx; 他的記憶體位置一定都是與 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的倍數會出甚麼問題嗎?? 如果不對齊的話下一個取到的記憶體空間可能就不是 SIZE_T 的倍數, 那下一筆資料就會被拆成存放在不同的 word 裏了... : 呃...等一下...我一邊打這篇請益文一邊想...難道說... : 要求t一定要是SIZE_T的倍數是為了要能夠達到平台的相容性嗎?? 是的,SIZE_T = sizeof(size_t) will be platform dependent. It will be 4 or 8 for 32 or 64-bit machine. : 雖然我還是不懂...以本次作業為例,obeject的data member都是char : char據說是可以一個Byte一個Byte的去吃記憶體的樣子? : 如果不是以SIZE_T為單位去拿記憶體 : 丟給memTestObj用,就一定會出包,不管char的面子有多大嗎?? 不會出包,只是下一個 memTestObj 的記憶體位置會不是 SIZE_T 的倍數... : 又,如果真的是系統所認定的物件大小size_t t : 不會是實作記憶體的時候不會出包的大小SIZE_T的倍數 : 那麼我們多丟給這個物件的記憶體,系統會了解嗎?? : 就是它會知道這裡面有多給的不能用的部分嗎? : 感覺起來有點毛毛的也......o.O 就是會浪費一些記憶體啊... : 2.如果在new的時候系統丟的size_t t其實一定會是SIZE_T的倍數 : (我記得上課的時候好像是這麼回事啊囧? : 上課的時候去算一個物件的大小最後都會取tosizeT說orz) : 也就是如果我剛剛腦包了,1.的問題根本不存在的話....囧 : 那麼,TODO裡的make sure....只是要我們assert它嗎XD? 就是系統丟 size_t t 不一定會是 SIZE_T 的倍數, 所以才要你寫 getMem() 的時候要確認. : 順帶一提,free的過程只是把記憶體丟給recycleList紀錄而已 : 其實原本的object pointer還是可以去存取這個位置 : 這樣好恐怖的感覺@@" : 尤其我試了一下...就算是內建的形態也是有這種情況 : 所以在外面寫的人只要一恍神還是會出很嚴重的問題...orz 這種 access freed memory 是很難避免的,除非我們都改成 object, 用 object 來包 pointer, 然後裡頭用個 reference count 來決定 pointer 是否已經沒人在用所以可以 reset 了. --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.224.45.175
1F:推 a3785lexx:恩恩!我的確有自己寫一些小程式來作實驗 11/15 02:20
2F:→ a3785lexx:可是囧的就是我寫出來記憶體位置之間都是差sizeof(Obj) 11/15 02:21
3F:→ a3785lexx:不知道是哪裡沒有搞清楚...XD 11/15 02:21
4F:推 a3785lexx:感謝教授的回覆! 11/15 02:26
5F:→ ric2k1:compiler 傳給 new 的是 sizeof(Obj), 但是你要在 getMem() 11/15 10:51
6F:→ ric2k1:裡頭 allocate SIZE_T 倍數的記憶體, 並且將return ptr設對 11/15 10:52
7F:推 a3785lexx:恩恩!非常感謝老師的回答!我終於了解到底作業要怎麼寫 11/16 20:12
8F:→ a3785lexx:了...XD 11/16 20:12
9F:→ a3785lexx:但是我感到奇怪的是,我自己寫小程式不去overload 11/16 20:13
10F:→ a3785lexx:operator new的時候,我去生成一串array然後看它們的 11/16 20:13
11F:→ a3785lexx:位置...它們不一定是差sizeof(size_t)...我就糊塗了XD 11/16 20:14







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP