亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > Delphi > 正文

DELPHI的原子世界(2)

2019-11-18 18:52:33
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

第二節(jié)  TClass原子
在System.pas單元中,TClass是這樣定義的:
  TClass = class of TObject;
它的意思是說(shuō),TClass是TObject的類(lèi)。因?yàn)門(mén)Object本身就是一個(gè)類(lèi),所以TClass就是所謂的類(lèi)的類(lèi)。
從概念上說(shuō),TClass是類(lèi)的類(lèi)型,即,類(lèi)之類(lèi)。但是,我們知道DELPHI的一個(gè)類(lèi),代表著一項(xiàng)VMT數(shù)據(jù)。因此,類(lèi)之類(lèi)可以認(rèn)為是為VMT數(shù)據(jù)項(xiàng)定義的類(lèi)型,其實(shí),它就是一個(gè)指向VMT數(shù)據(jù)的指針類(lèi)型!
在以前傳統(tǒng)的C++語(yǔ)言中,是不能定義類(lèi)的類(lèi)型的。對(duì)象一旦編譯就固定下來(lái),類(lèi)的結(jié)構(gòu)信息已經(jīng)轉(zhuǎn)化為絕對(duì)的機(jī)器代碼,在內(nèi)存中將不存在完整的類(lèi)信息。一些較高級(jí)的面向?qū)ο笳Z(yǔ)言才可支持對(duì)類(lèi)信息的動(dòng)態(tài)訪問(wèn)和調(diào)用,但往往需要一套復(fù)雜的內(nèi)部解釋機(jī)制和較多的系統(tǒng)資源。而DELPHI的Object Pascal語(yǔ)言吸收了一些高級(jí)面向?qū)ο笳Z(yǔ)言的優(yōu)秀特征,又保留可將程序直接編譯成機(jī)器代碼的傳統(tǒng)優(yōu)點(diǎn),比較完美地解決了高級(jí)功能與程序效率的問(wèn)題。
正是由于DELPHI在應(yīng)用程序中保留了完整的類(lèi)信息,才能提供諸如as和is等在運(yùn)行時(shí)刻轉(zhuǎn)換和判別類(lèi)的高級(jí)面向?qū)ο蠊δ?,而?lèi)的VMT數(shù)據(jù)在其中起了關(guān)鍵性的核心作用。有興趣的朋友可以讀一讀System單元的AsClass和IsClass兩個(gè)匯編過(guò)程,他們是as和is操作符的實(shí)現(xiàn)代碼,以加深對(duì)類(lèi)和VMT數(shù)據(jù)的理解。
有了`類(lèi)的類(lèi)型,就可以將類(lèi)作為變量來(lái)使用??梢詫㈩?lèi)的變量理解為一種特殊的對(duì)象,你可以象訪問(wèn)對(duì)象那樣訪問(wèn)類(lèi)變量的方法。例如:我們來(lái)看看下面的程序片段:
type
  TSampleClass = class of TSampleObject;
  TSampleObject = class( TObject )
  public
    constructor Create;
    destructor Destroy; override;
    class function GetSampleObjectCount:Integer;
    PRocedure GetObjectIndex:Integer;
  end;

var
  aSampleClass : TSampleClass;
  aClass : TClass;

在這段代碼中,我們定義了一個(gè)類(lèi)TSampleObject及其相關(guān)的類(lèi)類(lèi)型TSampleClass,還包括兩個(gè)類(lèi)變量aSampleClass和aClass。此外,我們還為T(mén)SampleObject類(lèi)定義了構(gòu)造函數(shù)、析構(gòu)函數(shù)、一個(gè)類(lèi)方法GetSampleObjectCount和一個(gè)對(duì)象方法GetObjectIndex。
首先,我們來(lái)理解一下類(lèi)變量aSampleClass和aClass的含義。
顯然,你可以將TSampleObject和TObject當(dāng)作常量值,并可將它們賦值給aClass變量,就好象將123常量值賦值給整數(shù)變量i一樣。所以,類(lèi)類(lèi)型、類(lèi)和類(lèi)變量的關(guān)系就是類(lèi)型、常量和變量的關(guān)系,只不過(guò)是在類(lèi)的這個(gè)層次上而不是對(duì)象層次上的關(guān)系。當(dāng)然,直接將TObject賦值給aSampleClass是不合法的,因?yàn)閍SampleClass是TObject派生類(lèi)TSampleObject的類(lèi)變量,而TObject并不包含與TSampleClass類(lèi)型兼容的所有定義。相反,將TSampleObject賦值給aClass變量卻是合法的,因?yàn)門(mén)SampleObject是TObject的派生類(lèi),是和TClass類(lèi)型兼容的。這與對(duì)象變量的賦值和類(lèi)型匹配關(guān)系完全相似。
然后,我們?cè)賮?lái)看看什么是類(lèi)方法。
所謂類(lèi)方法,就是指在類(lèi)的層次上調(diào)用的方法,如上面所定義的GetSampleObjectCount方法,它是用保留字class聲明的方法。類(lèi)方法是不同于在對(duì)象層次上調(diào)用的對(duì)象方法的,對(duì)象方法已經(jīng)為我們所熟悉,而類(lèi)方法總是在訪問(wèn)和控制所有類(lèi)對(duì)象的共同特性和集中管理對(duì)象這一個(gè)層次上使用的。在TObject的定義中,我們可以發(fā)現(xiàn)大量的類(lèi)方法,如ClassName、ClassInfo和NewInstance等等。其中,NewInstance還被定義為virtual的,即虛的類(lèi)方法。這意味作你可以在派生的子類(lèi)中重新編寫(xiě)NewInstance的實(shí)現(xiàn)方法,以便用特殊的方式構(gòu)造該類(lèi)的對(duì)象實(shí)例。
在類(lèi)方法中你也可使用self這一標(biāo)識(shí)符,不過(guò)其所代表的含義與對(duì)象方法中的self是不同的。類(lèi)方法中的self表示的是自身的類(lèi),即指向VMT的指針,而對(duì)象方法中的self表示的是對(duì)象本身,即指向?qū)ο髷?shù)據(jù)空間的指針。雖然,類(lèi)方法只能在類(lèi)層次上使用,但你仍可通過(guò)一個(gè)對(duì)象去調(diào)用類(lèi)方法。例如,可以通過(guò)語(yǔ)句aObject.ClassName調(diào)用對(duì)象TObject的類(lèi)方法ClassName,因?yàn)閷?duì)象指針?biāo)赶虻膶?duì)象數(shù)據(jù)空間中的頭4個(gè)字節(jié)又是指向類(lèi)VMT的指針。相反,你不可能在類(lèi)層次上調(diào)用對(duì)象方法,象TObject.Free的語(yǔ)句一定是非法的。
值得注意的是,構(gòu)造函數(shù)是類(lèi)方法,而析構(gòu)函數(shù)是對(duì)象方法!
什么?構(gòu)造函數(shù)是類(lèi)方法,析構(gòu)函數(shù)是對(duì)象方法!有沒(méi)有搞錯(cuò)?
你看看,當(dāng)你創(chuàng)建對(duì)象時(shí)分明使用的是類(lèi)似于下面的語(yǔ)句:
    aObject := TObject.Create;
分明是調(diào)用類(lèi)TObject的Create方法。而刪除對(duì)象時(shí)卻用的下面的語(yǔ)句:
    aObject.Destroy;
即使使用Free方法釋放對(duì)象,也是間接調(diào)用了對(duì)象的Destroy方法。
原因很簡(jiǎn)單,在構(gòu)造對(duì)象之前,對(duì)象還不存在,只存在類(lèi),創(chuàng)建對(duì)象只能用類(lèi)方法。相反,刪除對(duì)象一定是刪除已經(jīng)存在的對(duì)象,是對(duì)象被釋放,而不是類(lèi)被釋放。
最后,順便討論一下虛構(gòu)造函數(shù)的問(wèn)題。
在傳統(tǒng)的C++語(yǔ)言中,可以實(shí)現(xiàn)虛析構(gòu)函數(shù),但實(shí)現(xiàn)虛構(gòu)造函數(shù)卻是一個(gè)難題。因?yàn)?,在傳統(tǒng)的C++語(yǔ)言中,沒(méi)有類(lèi)的類(lèi)型。全局對(duì)象的實(shí)例是在編譯時(shí)就存在于全局?jǐn)?shù)據(jù)空間中,函數(shù)的局部對(duì)象也是編譯時(shí)就在堆棧空間中映射的實(shí)例,即使是動(dòng)態(tài)創(chuàng)建的對(duì)象,也是用new操作符按固定的類(lèi)結(jié)構(gòu)在堆空間中分配的實(shí)例,而構(gòu)造函數(shù)只是一個(gè)對(duì)已產(chǎn)生的對(duì)象實(shí)例進(jìn)行初始化的對(duì)象方法而已。傳統(tǒng)C++語(yǔ)言沒(méi)有真正的類(lèi)方法,即使可以定義所謂靜態(tài)的基于類(lèi)的方法,其最終也被實(shí)現(xiàn)為一種特殊的全局函數(shù),更不用說(shuō)虛擬的類(lèi)方法,虛方法只能針對(duì)具體的對(duì)象實(shí)例有效。因此,傳統(tǒng)的C++語(yǔ)言認(rèn)為,在具體的對(duì)象實(shí)例產(chǎn)生之前,卻要根據(jù)即將產(chǎn)生的對(duì)象構(gòu)造對(duì)象本身,這是不可能的。的確不可能,因?yàn)檫@會(huì)在邏輯上產(chǎn)生自相矛盾的悖論!
然而,正是由于在DELPHI中有動(dòng)態(tài)的類(lèi)的類(lèi)型信息,有真正虛擬的類(lèi)方法,以及構(gòu)造函數(shù)是基于類(lèi)實(shí)現(xiàn)的等等這些關(guān)鍵概念,才可實(shí)現(xiàn)虛擬的構(gòu)造函數(shù)。對(duì)象是由類(lèi)產(chǎn)生的,對(duì)象就好象成長(zhǎng)中的嬰兒,而類(lèi)就是它的母親,嬰兒自己的確不知道自己將來(lái)會(huì)成為什么樣的人,可是母親們卻用各自的教育方法培養(yǎng)出不同的人,道理是相通的。
正是在TComponent類(lèi)的定義中,構(gòu)造函數(shù)Create被定義為虛擬的,才能使不同類(lèi)型的控件實(shí)現(xiàn)各自的構(gòu)造方法。這就是TClass創(chuàng)造的類(lèi)之類(lèi)概念的偉大,也是DELPHI的偉大。

......................................

第三章  WIN32的時(shí)空觀
    我的老父親看著地上玩玩具的小孫子,然后對(duì)我說(shuō):“這孩子和小時(shí)的你一樣,喜歡把東西拆開(kāi),看過(guò)究竟才罷手”。想想我小時(shí)侯,經(jīng)常將玩具車(chē)、小鬧鐘、音樂(lè)盒,等等,拆得一塌糊涂,常常被母親訓(xùn)斥。
    我第一次理解計(jì)算機(jī)的基本原理,與我拆過(guò)的音樂(lè)盒有關(guān)。那是在念高中時(shí)的一本漫畫(huà)書(shū)上,一位白胡子老頭在講解智能機(jī)的理論,一位留八字胡的叔叔在說(shuō)計(jì)算機(jī)和音樂(lè)盒。他們說(shuō),計(jì)算機(jī)的中央處理器就是音樂(lè)盒中用來(lái)發(fā)音的那一排音樂(lè)簧片,計(jì)算機(jī)程序就是音樂(lè)盒中那個(gè)小圓筒上密布的凸點(diǎn),小圓筒的轉(zhuǎn)動(dòng)相當(dāng)于中央處理器的指令指針的自然移動(dòng),而小圓筒上代表音樂(lè)的凸點(diǎn)控制音樂(lè)簧片振動(dòng)發(fā)音相當(dāng)于中央處理器執(zhí)行程序的指令。音樂(lè)盒發(fā)出美妙的旋律,是按工匠早已刻在小圓筒上的音樂(lè)譜演奏的,計(jì)算機(jī)完成復(fù)雜的處理,是根據(jù)程序員預(yù)先編制好的程序?qū)崿F(xiàn)的。上大學(xué)之后,我才知道那個(gè)白胡子老頭就是科學(xué)巨匠圖靈,他的有限自動(dòng)機(jī)理論推動(dòng)了整個(gè)信息革命的發(fā)展,而那個(gè)留八字胡的叔叔就是計(jì)算機(jī)之父馮.諾依曼,馮氏計(jì)算機(jī)體系結(jié)構(gòu)至今仍然是計(jì)算機(jī)的主要體系機(jī)構(gòu)。音樂(lè)盒沒(méi)白拆,母親可以寬心。
    有深入淺出的理解,才能有高深而又簡(jiǎn)潔的創(chuàng)造。
    這一章我們將討論Windows的32位操作系統(tǒng)中與我們編程有關(guān)的基本概念,建立WIN32中正確的時(shí)空觀。希望閱讀完本章之后,我們能更加深入地理解程序、進(jìn)程和線程,理解執(zhí)行文件、動(dòng)態(tài)連接庫(kù)和運(yùn)行包的原理,看清全局?jǐn)?shù)據(jù)、局部數(shù)據(jù)和參數(shù)在內(nèi)存中的真相。


第一節(jié)  理解進(jìn)程
    由于歷史的原因,Windows是起源于DOS。而在DOS時(shí)代,我們一直只有程序的概念,而沒(méi)有進(jìn)程的概念。那時(shí)侯,只有操作系統(tǒng)的正規(guī)軍,如UNIX和VMS等等,才有進(jìn)程的概念,而且多進(jìn)程就意味著小型機(jī)、終端和多用戶,也意味著金錢(qián)。我絕大多數(shù)的時(shí)間只能使用相對(duì)廉價(jià)的微機(jī)和DOS系統(tǒng),只是在學(xué)操作系統(tǒng)這門(mén)課程時(shí)才開(kāi)始接觸進(jìn)程和小型機(jī)。
    在Windows 3.X之后,Microsoft才在圖形界面的操作系統(tǒng)站住腳跟,而我也是在這時(shí)開(kāi)始正式面對(duì)多任務(wù)和進(jìn)程的概念。以前在DOS下,同一時(shí)間只能執(zhí)行一個(gè)程序,而在Windows下同一時(shí)間可執(zhí)行多個(gè)程序,這就是多任務(wù)。在DOS下運(yùn)行一個(gè)程序的同時(shí),不能執(zhí)行相同的程序,而在Windows下,同一程序可以同時(shí)有兩個(gè)以上的副本在運(yùn)行,每一個(gè)運(yùn)行的程序副本就是一個(gè)進(jìn)程。更確切地說(shuō),任何程序的一次運(yùn)行就產(chǎn)生一個(gè)任務(wù),而每個(gè)任務(wù)就是一個(gè)進(jìn)程。
    當(dāng)將程序和進(jìn)程放到一起理解時(shí),可以認(rèn)為程序一詞說(shuō)的是靜態(tài)的東西,一個(gè)典型的程序是由一個(gè)EXE文件或一個(gè)EXE文件加上若干DLL文件組成的靜態(tài)代碼和數(shù)據(jù)。而進(jìn)程是程序的一次運(yùn)行,是在內(nèi)存中動(dòng)態(tài)運(yùn)行的代碼和動(dòng)態(tài)變化的數(shù)據(jù)。當(dāng)靜態(tài)的程序要求運(yùn)行時(shí),操作系統(tǒng)將為本次運(yùn)行提供一定的內(nèi)存空間,把靜態(tài)的程序代碼和數(shù)據(jù)調(diào)入這些內(nèi)存空間,將程序的代碼和數(shù)據(jù)進(jìn)行重定位映射之后,就在該空間內(nèi)執(zhí)行程序,這樣就產(chǎn)生了動(dòng)態(tài)的進(jìn)程。
    同一個(gè)程序同時(shí)運(yùn)行著的兩個(gè)副本,意味著在系統(tǒng)內(nèi)存中有兩個(gè)進(jìn)程空間,只不過(guò)它們的程序功能是一樣的,但處于不同的動(dòng)態(tài)變化的狀態(tài)之中。
    從進(jìn)程運(yùn)行的時(shí)間上來(lái)說(shuō),各進(jìn)程是同時(shí)執(zhí)行的,專(zhuān)業(yè)術(shù)語(yǔ)稱為并行執(zhí)行或并發(fā)執(zhí)行。但這主要是操作系統(tǒng)給我們的表面感覺(jué),實(shí)際上各進(jìn)程是分時(shí)執(zhí)行的,也就是各進(jìn)程輪流占用CPU的時(shí)間來(lái)執(zhí)行進(jìn)程的程序指令。對(duì)于一個(gè)CPU來(lái)說(shuō),同一時(shí)間只有一個(gè)進(jìn)程的指令在執(zhí)行。操作系統(tǒng)是調(diào)度進(jìn)程運(yùn)行的幕后操縱者,它不斷保存和切換各進(jìn)程在CPU中執(zhí)行的當(dāng)前狀態(tài),使得每一個(gè)被調(diào)度的進(jìn)程都認(rèn)為自己是完整和連續(xù)地運(yùn)行著。由于進(jìn)程分時(shí)調(diào)度的速度非???,所以給我們的感覺(jué)就是進(jìn)程都是同時(shí)運(yùn)行的。其實(shí),真正意義上的同時(shí)運(yùn)行只有在多CPU的硬件環(huán)境中才有。稍后在講述線程一節(jié)時(shí),我們將發(fā)現(xiàn),真正推動(dòng)進(jìn)程運(yùn)轉(zhuǎn)的是線程,進(jìn)程更重要的是提供了進(jìn)程空間。
    從進(jìn)程占據(jù)的空間上來(lái)說(shuō),各進(jìn)程空間是相對(duì)獨(dú)立的,每一個(gè)進(jìn)程在自己獨(dú)立的空間中運(yùn)行。一個(gè)程序既包括代碼空間又包括數(shù)據(jù)空間,代碼和數(shù)據(jù)都要占據(jù)進(jìn)程空間。Windows為每一進(jìn)程所需的數(shù)據(jù)空間分配實(shí)際的內(nèi)存,而對(duì)代碼空間一般都采用共享手段,將一個(gè)程序的一份代碼映射給該程序的多個(gè)進(jìn)程。這意味著,如果一個(gè)程序有100K的代碼并需要100K的數(shù)據(jù)空間,也就是總共需要200K的進(jìn)程空間,則第一次運(yùn)行程序時(shí)操作系統(tǒng)將分配200K的進(jìn)程空間,而運(yùn)行程序的第二個(gè)進(jìn)程時(shí),操作系統(tǒng)只分配100K的數(shù)據(jù)空間,而代碼空間則共享前一個(gè)進(jìn)程的空間。
    上面所說(shuō)的是Windows操作系統(tǒng)中進(jìn)程的基本時(shí)空觀,其實(shí)Windows的16位和32位操作系統(tǒng)在進(jìn)程的時(shí)空觀上有很大的差異。
    從時(shí)間上來(lái)說(shuō),16位的Windows操作系統(tǒng),如Windows 3.x等,進(jìn)程管理是非常簡(jiǎn)單的,它實(shí)際上只是一個(gè)多任務(wù)管理操作系統(tǒng)。而且,操作系統(tǒng)對(duì)任務(wù)的調(diào)度是被動(dòng)的,如果一個(gè)任務(wù)不自己放棄對(duì)消息的處理,操作系統(tǒng)就必須等待。由于16位Windows系統(tǒng)在管理進(jìn)程方面的缺陷,一個(gè)進(jìn)程運(yùn)行時(shí),完全占有著CPU的資源。在那個(gè)年代,為了16位Windows可以有機(jī)會(huì)調(diào)度別的任務(wù),微軟公司大力贊揚(yáng)開(kāi)發(fā)Windows應(yīng)用程序的開(kāi)發(fā)者是心胸寬闊的程序員,以使得他們樂(lè)意多編寫(xiě)幾行恩賜給操作系統(tǒng)的代碼。相反,WIN32的操作系統(tǒng),如Windows 95和NT等,才是具備了真正的多進(jìn)程和多任務(wù)操作系統(tǒng)的能力。WIN32中的進(jìn)程完全由操作系統(tǒng)調(diào)度,一旦進(jìn)程運(yùn)行的時(shí)間片結(jié)束,不管進(jìn)程是否還在處理數(shù)據(jù),操作系統(tǒng)將主動(dòng)切換到下一進(jìn)程。嚴(yán)格地說(shuō),16位的Windows操作系統(tǒng)不能算是完整的操作系統(tǒng),而32位的WIN32操作系統(tǒng)才是真正意義上的操作系統(tǒng)。當(dāng)然,微軟公司不會(huì)說(shuō)WIN32彌補(bǔ)了16位Windows的缺陷,而是宣稱WIN32實(shí)現(xiàn)了一種稱為“搶占式多任務(wù)”的先進(jìn)技術(shù),這是商業(yè)手段。
    從空間上看,16位的Windows操作系統(tǒng)中的進(jìn)程空間雖然相對(duì)獨(dú)立,但進(jìn)程之間可已很容易地互相訪問(wèn)對(duì)方的數(shù)據(jù)空間。因?yàn)?,這些進(jìn)程實(shí)際是在相同的物理空間中的不同的數(shù)據(jù)段而已,而且不當(dāng)?shù)牡刂凡僮骱苋菀自斐慑e(cuò)誤的空間讀寫(xiě),并使操作系統(tǒng)崩潰。然而,在WIN32操作系統(tǒng)中,各進(jìn)程空間完全是獨(dú)立的。WIN32為每一個(gè)進(jìn)程提供一個(gè)可達(dá)4G的虛擬的,并且是連續(xù)的地址空間。所謂連續(xù)的地址空間,是指每一個(gè)進(jìn)程都擁有從$00000000到$FFFFFFFF的地址空間,而不是向16位Windows的分段式空間。在WIN32中,你完全不必?fù)?dān)心自己的讀寫(xiě)操作會(huì)無(wú)意地影響到其他進(jìn)程空間中的數(shù)據(jù),也不用擔(dān)心別的進(jìn)程會(huì)來(lái)騷擾你的工作。同時(shí),WIN32為你的進(jìn)程提供的連續(xù)的4G虛擬空間,是操作系統(tǒng)在硬件的支持下將物理內(nèi)存映射給你的,你雖然擁有如此廣闊的虛擬空間,但系統(tǒng)決不會(huì)浪費(fèi)一個(gè)字節(jié)的物理內(nèi)存。

第二節(jié)  進(jìn)程空間
    在我們用DELPHI編寫(xiě)WIN32的應(yīng)用程序時(shí),很少去關(guān)心進(jìn)程在運(yùn)行時(shí)的內(nèi)部世界。因?yàn)閃IN32為我們的進(jìn)程提供了4G的連續(xù)虛擬進(jìn)程空間,可能目前世界上最龐大的應(yīng)用程序也只用到了其中的部分空間。似乎進(jìn)程空間是無(wú)限的,但4G的進(jìn)程空間是虛擬的,而你機(jī)器的實(shí)際內(nèi)存可能與此相差甚遠(yuǎn)。雖然,進(jìn)程擁有如此廣闊的空間,但有些復(fù)雜算法的程序還是會(huì)因?yàn)槎褩R绯龆鵁o(wú)法運(yùn)行,特別是含有大量遞歸算法的程序。
    因此,深入地認(rèn)識(shí)和了解這4G的進(jìn)程空間的結(jié)構(gòu),以及它與物理內(nèi)存的關(guān)系等等,將有助于我們更清楚地認(rèn)識(shí)WIN32的時(shí)空世界,從而可在實(shí)際的開(kāi)發(fā)工作中運(yùn)用正確的世界觀和方法論解決各種難題。
    下面,我們將通過(guò)簡(jiǎn)單的實(shí)驗(yàn),來(lái)了解WIN32的進(jìn)程空間的內(nèi)部世界。這可能需要一些對(duì)CUP寄存器和匯編語(yǔ)言的知識(shí),但我盡量用簡(jiǎn)單的語(yǔ)言來(lái)說(shuō)明。
    當(dāng)啟動(dòng)DELPHI時(shí),將自動(dòng)產(chǎn)生一個(gè)Project1的項(xiàng)目,我們就拿它開(kāi)刀。在Project1.dpr原程序的任意位置設(shè)一斷點(diǎn),比如,就在begin一句處設(shè)一斷點(diǎn)。然后運(yùn)行程序,當(dāng)程序運(yùn)行到斷點(diǎn)時(shí)會(huì)自動(dòng)停下來(lái)。這時(shí),我們就可以打開(kāi)調(diào)試工具中的CPU窗口來(lái)觀察進(jìn)程空間的內(nèi)部結(jié)構(gòu)了。
    當(dāng)前的指令指針寄存器Eip是停在$0043E4B8,從程序指令所在地址的最高兩位16進(jìn)制數(shù)都是零,可以看出當(dāng)前的程序處在4G進(jìn)程空間相當(dāng)?shù)锥说牡刂肺恢?,其占?jù)$00000000到$FFFFFFFF的相當(dāng)少的地址空間。
    在CPU窗口中的指令框中,你可以向上查看進(jìn)程空間中的內(nèi)容。當(dāng)查看小于$00400000的空間內(nèi)容時(shí),你會(huì)發(fā)現(xiàn)小于$00400000的內(nèi)容出現(xiàn)一串串的問(wèn)號(hào)“????”,那是因?yàn)樵摰刂房臻g還未映射到實(shí)際物理空間的緣故。如果在這時(shí),你查看一下全局變量HInstance的16進(jìn)制值就會(huì)發(fā)現(xiàn)它也是$00400000。雖然HInstance反映的是進(jìn)程實(shí)例的句柄,其實(shí),它就是程序被加載到內(nèi)存中的起始地址值,在16位Windows中也是如此。因此,我們可以認(rèn)為進(jìn)程的程序是從$00400000開(kāi)始加載的,也就是從4G虛擬空間中的4M以后的空間開(kāi)始是程序加載的空間。
    從$00400000往后,到$0044D000之前,主要是程序代碼和全局?jǐn)?shù)據(jù)的地址空間。在CPU窗口中的堆??蛑?,可以查看到當(dāng)前堆棧的地址。同樣,你會(huì)發(fā)現(xiàn)當(dāng)前堆棧的地址空間是從$0067B000到$00680000的,長(zhǎng)度為$5000。其實(shí),進(jìn)程最小的堆??臻g大小就是$5000,它是根據(jù)編譯DELPHI程序時(shí)在ProjectOptions中Linker頁(yè)中設(shè)置的Min stack size值,加上$1000而得到的。堆棧是由高端地址向底端增長(zhǎng)的,當(dāng)程序運(yùn)行的堆棧不夠時(shí),系統(tǒng)將自動(dòng)向地端地址方向增加堆??臻g的大小,這一過(guò)程將把更多的實(shí)際內(nèi)存映射到進(jìn)程空間??稍诰幾gDELPHI程序時(shí),通過(guò)設(shè)置ProjectOptions中Linker頁(yè)中Max stack size的值,控制可增加的最大堆棧空間。特別是在含有深層次的子程序調(diào)用關(guān)系或運(yùn)用遞歸算法的程序中,一定要合理地設(shè)置Max stack size的值。因?yàn)椋{(diào)用子程序是需要耗用堆??臻g,而堆棧耗盡之后,系統(tǒng)就會(huì)拋出“Stack overflow”的錯(cuò)誤。
    似乎,從堆??臻g之后的進(jìn)程空間就應(yīng)該是自由的空間了吧。其實(shí)不然,WIN32的有關(guān)資料說(shuō),$80000000之后的2G空間是系統(tǒng)使用的空間??磥?lái),進(jìn)程能夠真正擁有的只有2G空間。其實(shí),進(jìn)程能真正擁有的空間連2G都不夠,因?yàn)閺?00000000到$00400000的這4M空間也是禁區(qū)。
    但不管怎樣,我們的進(jìn)程可以使用的地址還是非常廣闊的。特別是堆??臻g之后到$80000000之間,是進(jìn)程空間的主戰(zhàn)場(chǎng)。進(jìn)程從系統(tǒng)分配的內(nèi)存空間將被映射到這塊空間,進(jìn)程加載的動(dòng)態(tài)連接庫(kù)將被映射到這塊空間,新建線程的線程堆??臻g也將映射到這塊空間,幾乎所有涉及分配內(nèi)存的操作都將映射到這塊空間。請(qǐng)注意,這里所說(shuō)的映射,意味著實(shí)際內(nèi)存與這塊虛擬空間的對(duì)應(yīng),沒(méi)有映射為實(shí)際內(nèi)存的進(jìn)程空間是無(wú)法使用的,就象調(diào)試時(shí)CPU窗口指令框中的那一串串的“????”。
................

謝謝閱讀!


上一篇:DELPHI的原子世界(1)

下一篇:如何將界面代碼和功能代碼分離(基于Delphi/VCL)

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門(mén)圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

午夜一区二区三区免费| 欧美成a人片免费观看久久五月天| 第四色婷婷基地| 亚洲一区二区三区在线观看网站| 国产一区二区三区久久久久久久久| 一区二区三区高清在线观看| 欧美成人a∨高清免费观看| 日本人妖在线| 欧美aaaaaaa| 好看的日韩精品视频在线| 啊v视频在线一区二区三区| 无码人妻精品一区二区三区在线| 欧美在线播放视频| 日韩精品中午字幕| 暖暖视频在线免费观看| 妖精视频成人观看www| 好男人官网在线| 久久99久久久欧美国产| 亚洲精品乱码久久久久久金桔影视| 亚洲精品视频在线| 免费日韩av片| 亚洲经典视频在线观看| 91国内精品久久久久| 国产视频一二三| 亚州一区二区| 同心难改在线观看| 91黄在线观看| 亚洲AV成人无码精电影在线| 国产精品久久AV无码| 韩国精品一区二区三区| 2018av| 99re视频在线观看| 成年网站在线免费观看| 免费尤物视频| 久久亚洲一区二区| 久久精品国产电影| 亚洲最大福利视频| 日韩激情视频在线播放| 国产精品视频1区| 免费观看日韩电影| 午夜激情福利电影| 亚洲最新视频在线| 国产精品果冻传媒潘| 亚洲午夜久久久影院伊人| 日韩和欧美的一区二区| 外国精品视频在线观看| 亚洲午夜一级| 中国av一区二区三区| 欧美黑人经典片免费观看| 超碰这里只有精品| 国产精品美女久久久久久久久久久| 综合日韩在线| 一区二区三区视频免费看| 麻豆精品99| 国产激情美女久久久久久吹潮| www视频在线观看com| 精品视频免费观看| 亚洲第一成肉网| 丁香花高清电影在线观看完整版| 精灵使的剑舞无删减版在线观看| 7777精品伊久久久大香线蕉语言| 91精品久久久久久久久久久久| 欧美午夜精品久久久久久超碰| www.青青草.com| 中文字幕精品无| 韩国三级一区| 日韩欧美精品在线| 8x8x拔插拔插影库永久免费| 一色屋免费视频| 中国特级黄色大片| 57pao国产一区二区| 欧美午夜影院在线视频| 丁香亚洲综合激情啪啪综合| 亚洲欧美成人一区| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 精品粉嫩aⅴ一区二区三区四区| 国产在线精品一区二区三区》| 午夜精品一区二区三区av| 在线不卡国产精品| 国产美女精品在线观看| 新天堂中文资源官网在线观看| 成人免费在线一区二区三区| 永久免费不卡在线观看黄网站| 一区二区三区天堂av| 欧美videos另类齐全| 麻豆网站免费在线观看| 免费大秀视频在线播放| 亚洲黄色精品| 欧美成人午夜| www.一区| 欧美性狂猛xxxxxbbbbb| 日韩高清专区| 天天色天天看| 色偷偷7777www人| 激情欧美一区二区三区中文字幕| 美国十次综合久久| 琪琪五月天综合婷婷| 怡红院视频网站| 成人av免费电影网站| 欧美日韩黄色一区二区| 国产精品成人在线| 欧美日韩国产高清一区| 无线免费在线视频| 欧美国产日韩在线| 亚洲成人aaa| 国产91在线播放精品| 欧美大胆a视频| 国产情侣一区在线| 岛国视频午夜一区免费在线观看| 日韩精品一区二区在线观看| 美女av一区| 2019中文字幕在线| 亚洲人metart人体| 免费黄色欧美视频| eeuss鲁丝片eeuss影院| av在线dvd| 美国黄色一级毛片| 欧美亚洲一区三区| 91麻豆国产自产在线观看亚洲| 久久久无码精品亚洲国产| 欧美日韩精品免费观看视完整| 成人黄色网址| 九色综合国产一区二区三区| 成人av一区二区三区在线观看| 在线播放不卡| 午夜精品网站| 久久久久久久久久久久网站| 美女网站视频色| 一色屋精品亚洲香蕉网站| 最新日韩免费视频| 欧美日韩调教| 91精品国产色综合久久不卡电影| 男女视频网站在线观看| 同性视频网站免费男| 黄页在线观看| 欧美韩日一区二区三区四区| 欧美欧美午夜aⅴ在线观看| 福利一区在线观看| 欧美独立站高清久久| 高清电影在线观看免费| 国产精品国产精品| 亚洲一区亚洲二区亚洲三区| 95影院理论片在线观看| 99久久免费精品高清特色大片| 亚洲成人精品一区| 欧美男人操女人视频| 又大又硬又爽免费视频| 免费a级观看| 国产精品嫩草99av在线| 一区二区三区伦理| 国产一区二区三区四区五区| 在线播放91灌醉迷j高跟美女| 日本亚洲导航| 最近中文字幕免费观看| 一区二区久久久久| 国产精品久久久久久久久免费高清| 日韩中文一区二区| 99久久伊人精品影院| 91亚洲一区精品| 四虎影视1304t| 久久久久国色av免费观看性色| 秋霞午夜一区二区三区视频| 激情综合五月网| 黑人巨大精品欧美一区二区小视频| 免费网站看v片在线a| 丰满人妻一区二区三区53视频| 91视频久久久| 欧美日韩国产在线观看网站| 国产三级理论片| 另类小说综合网| 国产成人精品综合久久久久99| 欧美日韩免费一区二区| 中文字幕亚洲欧美一区二区三区| 超碰国产在线观看| 日韩黄色在线观看| 99精品人妻国产毛片| 亚洲资源网你懂的| 蜜桃精品视频在线| 97碰碰碰免费公开在线视频| 青青草原在线亚洲| 91国产在线免费观看| 亚洲黄色av片| 日本精品一区| 欧美在线va视频| 亚洲综合日韩中文字幕v在线| 97caopor国产在线视频| 国产精品美女久久久久av爽| 午夜av免费看| 国产一区二区在线观看免费播放| 天天影视欧美综合在线观看| 亚洲黄色小视频| 男人艹女人网站| 亚洲一区二区在线免费观看| 3d欧美精品动漫xxxx无尽| 亚洲娇小xxxx欧美娇小| 国产精品偷伦视频免费观看国产| 国产区视频在线观看| 国产成人av一区二区| 欧美三级日本三级少妇99| 久久五月婷婷丁香社区| 一区二区中文| 国产又粗又大又长| 国产精品日本一区二区三区在线| 亚洲人成午夜免电影费观看| 亚洲黄页视频免费观看| 中文字幕亚洲精品视频| 免费黄色小视频| 理论片大全免费理伦片| 91系列在线观看| 中文字幕123| 717影院理论午夜伦不卡久久| 日韩福利小视频| 美女在线观看视频一区二区| 国产一区二区欧美日韩| 成人免费短视频| 先锋影音在线播放av| 国产一二三四五| 久久艹精品视频| 国产美女在线精品免费观看| 黄色91视频| 无遮挡亚洲一区| 久久成人免费电影| 亚洲成av人片在线观看香蕉| 五月婷婷导航| av女优在线播放| 成人国产精品色哟哟| 99综合精品久久| 欧美a一片xxxx片| 亚洲欧美日韩天堂一区二区| 国产成人无码精品久久久性色| 国产精品永久入口久久久| 91久久国产精品91久久性色| 精品一区二区三区五区六区七区| 婷婷国产v国产偷v亚洲高清| 在线 亚洲欧美在线综合一区| 黄视频网站在线| 久草视频免费在线| 99久久久久久中文字幕一区| 免费在线观看黄视频| 亚洲成av人片一区二区密柚| 国产网站av| 婷婷久久综合| 亚洲高清av| 国产精品极品国产中出| 久久精品女人天堂av免费观看| 亚洲欧洲日韩在线| 日韩区国产区| 成人羞羞国产免费| 91综合网人人| 婷婷丁香花五月天| 羞羞的视频在线| av在线亚洲色图| 无码人妻丰满熟妇精品区| 亚洲激情视频小说| 成人激情综合| 午夜国产在线视频| 91在线精品一区二区| 亚洲欧洲精品成人久久奇米网| 色婷婷久久久亚洲一区二区三区| 欧美精品在线观看| 国产三区二区一区久久| 91传媒久久久| 成人白浆超碰人人人人| 亚洲综合无码一区二区| 图片区小说区国产精品视频| 自拍网站在线观看| 国产精品久久久久蜜臀| 欧美激情视频网址| 成人台湾亚洲精品一区二区| japan高清日本乱xxxxx| 香蕉久久免费影视| 欧美成人一区二区三区四区| 五月天一区二区| 国产精品对白一区二区三区| 亚洲一区二区三区在线观看视频| 国产精品123区| 成人做爰高清视频网站| 久久久无码中文字幕久...| 中文另类视频| 欧美性大战久久| 最近中文字幕无免费| 精品国产三级电影在线观看| 日韩成人黄色片| 精品一区二区6| 日韩在线不卡一区| 一区二区三区午夜视频| 你懂的视频网| sese在线视频| 欧美高清在线一区| 久久伦理在线| 欧美高清日韩| 精品国产伦一区二区三区观看方式| 日韩三级影视基地| 91网址在线播放| 成人av在线播放| 欧美三区在线观看| 日本成人一区二区三区| av午夜精品一区二区三区| 国产精品免费不| 色婷婷狠狠五月综合天色拍| 欧美一级bbbbb性bbbb喷潮片| 成人午夜影院在线观看| 一区三区在线欧| 91久久精品一区二区二区| 亚洲免费在线视频一区 二区| 久久99精品久久久久子伦| 亚洲欧美激情在线视频| 精品视频在线播放免| 官网99热精品| 国产精品白丝av嫩草影院| 手机在线精品视频| 国产精品美女| 高清一区二区三区四区五区| 播放灌醉水嫩大学生国内精品| 精品人妻少妇嫩草av无码| 在线免费一区| 免费看黄在线看| 欧美日韩一区久久| 欧美人与物videos另类| 国产日韩欧美成人| 中文字幕欧美国产| 国产中文字幕精品| 欧美日韩国产综合视频在线观看中文| 欧美freesex黑人又粗又大| 久久久电影一区二区三区| 91精品国产综合久久精品app| 深夜福利视频在线免费观看| 国产在线精品一区免费香蕉|