作者kickpp (踢屁屁)
看板EE_DSnP
标题Re: [问题] sizeof(size_t) 之倍数
时间Sat Nov 19 00:30:33 2011
看了这篇我也想了一个小时...
但我自己的理解是这样...
非常没有把握 说不定会误导大家XDDD
还是请老师出面说明比较好...
:※ 引述《vincere (vin)》之铭言:
:因为想了一个晚上
:虽然有听老师讲过、爬过文
:但感觉还是没有完全地了解
:不太敢随便下手
:所以想要请教大家一下
:我知道要取sizeof(size_t)之倍数记忆体的原因
:是为了做到platform dependent
:因为系统在new的时後
:会对齐size_t为倍数的位置
之所以一次给size_t的倍数大小记忆体
应该是因为作业系统汇流排一次传输的bits数就是这麽大
32位元一次读32 bits(4 bytes) 64位元一次读64 bits(8 bytes)
:但在作业中
:我们先自己跟系统要一块memory
:来後再根据new多少再来分配记忆体
:但这里我不是很清楚的是
:为何对自己要到的记忆体
:不能依照真正object大小来要
:而是也要跟系统一样要sizeof(size_t)为倍数的记忆体大小呢?
:举例说:
:一开始可能将0x00000000~0x00000007位置的记忆体分配出去
:然後下次再从0x00000008开始开始
:原因是因为
:就算是我们自己已经要来的MemBlock,
:也无法aceess/或是指到非sizeof(size_t)倍数的记忆体?
我认为pointer应该是bytewise的耶
所以可以acess到非size_t倍数大小位址的记忆体
以64-bit系统来说
就只是把包含你要acess的位址部分的memory一次读出来
例如0x00000006就是读出0x00000000~0x00000007然後acess第7个byte之後的东西
:还是说只是单纯要模仿机器每次都切齐sizeof(size_t)倍数的记忆体位置呢?
所以我认为我们是在模仿机器每次给记忆体的方式(4 byte倍数 or 8 byte倍数)
目的是为了让我们在自己管理的memory情况下
pointer也能像平常一般下使用不出错
譬如说
在64-bit系统下
假设今天有一个class A实际大小是39 bytes
如果我们不模仿系统存记忆体会以倍数存且留空位的话
今天假设宣告A* ptr = new A [2];
若计算两个物件A占用的记忆体大小
系统总共用了80 bytes存放 而我们用了78 bytes存放(依此类推...)
则
如果要以*(ptr + 1)来acess ptr[1] 後者就会出错!
:或是另有其它隐情?
:不好意思小的观念不清
:恳请解惑
:感激不尽
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.25.106
※ 编辑: vincere 来自: 140.112.25.106 (11/18 14:13)
1F:推 simpdanny:因为new[n]的时候 系统会要求对齐後bytes*n+SIZE_T 11/18 15:37
2F:→ simpdanny:所以中间一定会有一些零碎bytes是系统会空掉的 11/18 15:38
3F:→ vincere:所以意思是说 假如我在new的过程中 想要拿memory block中 11/18 16:18
4F:→ vincere:*(_ptr+5)所相对的记忆体时没办法的?而是它会要求对应的 11/18 16:20
所以依我的想法来说
*(_ptr + 5)当然可以acess到位址真的是_ptr + 5的记忆体内容...
5F:→ vincere:*(ptr+8)开始的位置?如果我强制assign给它程式是否会 11/18 16:22
6F:→ vincere:crash掉?如果想错恳请纠正 11/18 16:22
7F:推 simpdanny:应该是没办法 因为new operator会自动用他的! 11/18 17:19
8F:→ vincere:感激:) 似乎比较了解了 11/18 17:32
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.252.206
※ 编辑: kickpp 来自: 140.112.252.206 (11/19 01:13)
9F:推 vincere:非常感谢你:))) 11/19 06:41