作者ric2k1 (Ric)
看板EE_DSnP
标题Re: [请益] 两个getMem里的sizeof(size_t)...@@
时间Sun Nov 15 01:31:19 2009
※ 引述《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