林烏山我估計這回作者要“大顯身手了”。這是他的興趣和特長!
不愧是陪我過完《廢都物語》五周目的法爺,就是懂我!
但考慮到你對小梅的需要,這次還是交給你了(
林烏山作者你什么意思!這么著急是嗎?。ㄊ掷锉蝗艘环莶牧希?/p>
梅秋月(走過來)林烏山,你怎么和作者吵起來了?
林烏山?。繘]什么,就是我們又得忙活了。
梅秋月沒關(guān)系啦,只要和你在一起,我是不會累的~
林烏山嗯。(嗯?)
林烏山所以……讓我們看看作者整了個什么活……
梅秋月我也要看?。愡^來)
林烏山——害,沒什么,就是利用一些基礎(chǔ)的小東西偷到了自家電腦的部分運行時內(nèi)存罷了。
林烏山既然這樣……那么本章就沒有什么實際價值了。
梅秋月……沒關(guān)系,為了保證作者的連續(xù)更新,我們就配合一下吧!
林烏山嗯。
林烏山——梅秋月啊,按照慣例,先做個復(fù)習(xí)吧。如果直接/* int* p;cout<<*p; */就會得到一串隨機數(shù)字。請問為什么這串?dāng)?shù)字是隨機的呢?
梅秋月我知道!因為變量沒有初始化!
林烏山不錯。那么,/* int* p;p++; */中p++表示讓p做什么?
梅秋月讓p指向下一個地址!
林烏山很好?,F(xiàn)在我們知道,為了正常的使用,變量都需要初始化以保證不會出現(xiàn)不可預(yù)測的結(jié)果。那么,如果是不正常的使用呢?比如,我就是想讀到內(nèi)存里原有的東西呢?
梅秋月嗯……那么就不初始化了?
林烏山嗯。作者正是抱著這樣的想法,寫出了“內(nèi)存偷取器”。
梅秋月……不會吧?事情還可以這么單純的嗎?
林烏山沒辦法?!唧w實現(xiàn)也很簡單,new兩個指針,再開一個數(shù)據(jù)數(shù)組,把兩個指針指向的地址統(tǒng)一,然后一個往前翻,一個往后翻,最后把翻到的東西輸出,這就是全部操作。
梅秋月……聽起來好簡單啊,那出什么岔子了嗎?
林烏山……不然這章就沒什么好寫的了。作者發(fā)現(xiàn),在偷取總長度達到約20000時程序會在幾秒內(nèi)報3221225477。這個錯誤作者在寫出形如freopen(file,"r",stdout)的語句時也遇到過,并且從開始運行到報錯的時間與正確操作的時間相差不大。我們來想一想這是為什么呢?
梅秋月嗯……會不會是因為超出地址表示范圍了?
林烏山我和作者一開始都是這樣想的,直到我們問了他的媽媽。她告訴我們,為了防止這種情況發(fā)生,硬件在讀地址時只會認(rèn)有效的那幾位?!覀儊碜鰝€算數(shù)題,4GB=2^2GB=2^(2+10)MB=2^(12+10)KB=2^32B,剛好對應(yīng)32位計算機的最大尋址范圍。套用這一結(jié)果,我們立刻得到作者的8GB內(nèi)存需要用33位尋址。這就為作者電腦的循環(huán)地址實現(xiàn)提供了理論基礎(chǔ)。
林烏山……所以為什么會報3221225477這個問題,我們就沒主意了。
梅秋月啊?……要不,我們再聊點別的?
林烏山……也可以。作者用治標(biāo)不治本的方法,規(guī)避了這一問題,然后偷到了不少好東西。至于都是些什么,一是因為作者不記得了,二是因為可能涉及個人隱私,所以就是后話了。梅秋月,休息吧~
梅秋月好的~