林乌山我估计这回作者要“大显身手了”。这是他的兴趣和特长!
不愧是陪我过完《废都物语》五周目的法爷,就是懂我!
但考虑到你对小梅的需要,这次还是交给你了(
林乌山作者你什么意思!这么着急是吗!(手里被塞了一份材料)
梅秋月(走过来)林乌山,你怎么和作者吵起来了?
林乌山啊?没什么,就是我们又得忙活了。
梅秋月没关系啦,只要和你在一起,我是不会累的~
林乌山嗯。(嗯?)
林乌山所以……让我们看看作者整了个什么活……
梅秋月我也要看!(凑过来)
林乌山——害,没什么,就是利用一些基础的小东西偷到了自家电脑的部分运行时内存罢了。
林乌山既然这样……那么本章就没有什么实际价值了。
梅秋月……没关系,为了保证作者的连续更新,我们就配合一下吧!
林乌山嗯。
林乌山——梅秋月啊,按照惯例,先做个复习吧。如果直接/* int* p;cout<<*p; */就会得到一串随机数字。请问为什么这串数字是随机的呢?
梅秋月我知道!因为变量没有初始化!
林乌山不错。那么,/* int* p;p++; */中p++表示让p做什么?
梅秋月让p指向下一个地址!
林乌山很好。现在我们知道,为了正常的使用,变量都需要初始化以保证不会出现不可预测的结果。那么,如果是不正常的使用呢?比如,我就是想读到内存里原有的东西呢?
梅秋月嗯……那么就不初始化了?
林乌山嗯。作者正是抱着这样的想法,写出了“内存偷取器”。
梅秋月……不会吧?事情还可以这么单纯的吗?
林乌山没办法。……具体实现也很简单,new两个指针,再开一个数据数组,把两个指针指向的地址统一,然后一个往前翻,一个往后翻,最后把翻到的东西输出,这就是全部操作。
梅秋月……听起来好简单啊,那出什么岔子了吗?
林乌山……不然这章就没什么好写的了。作者发现,在偷取总长度达到约20000时程序会在几秒内报3221225477。这个错误作者在写出形如freopen(file,"r",stdout)的语句时也遇到过,并且从开始运行到报错的时间与正确操作的时间相差不大。我们来想一想这是为什么呢?
梅秋月嗯……会不会是因为超出地址表示范围了?
林乌山我和作者一开始都是这样想的,直到我们问了他的妈妈。她告诉我们,为了防止这种情况发生,硬件在读地址时只会认有效的那几位。——我们来做个算数题,4GB=2^2GB=2^(2+10)MB=2^(12+10)KB=2^32B,刚好对应32位计算机的最大寻址范围。套用这一结果,我们立刻得到作者的8GB内存需要用33位寻址。这就为作者电脑的循环地址实现提供了理论基础。
林乌山……所以为什么会报3221225477这个问题,我们就没主意了。
梅秋月啊?……要不,我们再聊点别的?
林乌山……也可以。作者用治标不治本的方法,规避了这一问题,然后偷到了不少好东西。至于都是些什么,一是因为作者不记得了,二是因为可能涉及个人隐私,所以就是后话了。梅秋月,休息吧~
梅秋月好的~