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灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP