最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

句柄與指針的區(qū)別

2023-09-19 11:44 作者:bramble1990  | 我要投稿

1.句柄與指針,是什么?

  • 指針:

指針 英文代稱:pointer

指針也就是內(nèi)存地址,指針變量是用來存放內(nèi)存地址的變量,在同一CPU架構(gòu)下,不同類型的指針變量所占用的存儲單元長度是相同的,而存放數(shù)據(jù)的變量因數(shù)據(jù)的類型不同,

所占用的存儲空間長度也不同。有了指針以后,不僅可以對數(shù)據(jù)本身,也可以對存儲數(shù)據(jù)的變量地址進(jìn)行操作


  • 句柄:


句柄 英文代稱:handle

在英文中:有操作、處理、控制之類的意義。作為一個(gè)名詞時(shí),是指某個(gè)中間媒介,通過這個(gè)中間媒介可控制、操作某樣?xùn)|西

通俗的比喻:

1.句柄就好比手機(jī)號碼,你不必時(shí)時(shí)刻刻關(guān)心你要聯(lián)系的人在哪里,你只要有需要的時(shí)候根據(jù)電話號碼打ta電話就能跟ta聯(lián)系

2.就比如把手:門把手、鍋把手、鏟把手、刀把;它們并不直接提供功能性而是一種媒介 是你使用上面:門、鍋、鏟、刀必須要握或拿的。

從計(jì)算機(jī)領(lǐng)域來講句柄handle通常是某個(gè)數(shù)字標(biāo)記,通過標(biāo)記操作資源。在計(jì)算機(jī)領(lǐng)域有不同的叫法,有時(shí)叫ID,有時(shí)叫描述符(descriptor),在Windows平臺就叫各種 handle了


2.為什么必須用句柄?

句柄:是一個(gè)long形的整數(shù)值,長度為16位。應(yīng)用程序先調(diào)用一個(gè)Windows函數(shù)來獲得一個(gè)句柄,之后其他的Windows函數(shù)就可以使用該句柄,以引用相應(yīng)的對象。在Windows編程中會用到大量的句柄


3.句柄,上下文,混淆?

  • 上下文:

上下文· 英文代稱:Context

計(jì)算機(jī)中,相對于進(jìn)程而言,上下文就是進(jìn)程執(zhí)行時(shí)的環(huán)境。具體來說就是各個(gè)變量和數(shù)據(jù),包括所有的寄存器變量、進(jìn)程打開的文件、內(nèi)存信息等。

環(huán)境可以包括當(dāng)時(shí)程序狀態(tài)以及變量的狀態(tài),例如線程切換的時(shí)候在內(nèi)核會發(fā)生上下文切換,這里的上下文就包括了當(dāng)時(shí)寄存器的值,把寄存器的值都保存起來,

等下次該線程又得到CPU時(shí)間的時(shí)候再恢復(fù)寄存器的值,這樣程序才能正確的運(yùn)行。

  • 總結(jié):

句柄與上下文不同 上下文是一種環(huán)境,句柄是調(diào)用某個(gè)程序的整數(shù)值



 句柄和指針是兩個(gè)關(guān)鍵的概念,在計(jì)算機(jī)科學(xué)中經(jīng)常被使用。它們的主要目的是支持系統(tǒng)內(nèi)存的動(dòng)態(tài)分配和管理,以確保在運(yùn)行時(shí)程序可以動(dòng)態(tài)地訪問和操作不同類型的數(shù)據(jù)。句柄和指針有許多相同之處,但它們還有一些重要的區(qū)別,這些區(qū)別對于理解它們的實(shí)際用途和使用情況非常重要。在本文中,我們將詳細(xì)探討句柄和指針的概念以及它們之間的區(qū)別。

  一、句柄的定義

  句柄是一種指向內(nèi)存塊的特殊類型的指針。它是一種用來表示一個(gè)對象或?qū)ο蟮囊玫木浔?,通常是一個(gè)整數(shù)值。句柄值很少直接使用,而是在API調(diào)用中使用。由于句柄是指向?qū)ο蟮闹羔?,因此它們?jīng)常用于動(dòng)態(tài)堆內(nèi)存分配,例如,向操作系統(tǒng)請求動(dòng)態(tài)分配內(nèi)存而沒有直接使用指針來指向內(nèi)存塊。句柄還被用于通過非托管代碼訪問托管對象,非托管代碼不能直接訪問托管對象,只能通過托管代碼提供的句柄來間接訪問。

  二、指針的定義

  指針是在程序中指向內(nèi)存地址的變量,它存儲了所指向的內(nèi)存地址。指針可以指向內(nèi)存中的任何數(shù)據(jù)類型的變量,包括標(biāo)量、數(shù)組、結(jié)構(gòu)體和函數(shù)等。指針經(jīng)常用于在程序中動(dòng)態(tài)地分配和管理內(nèi)存,以及通過引用修改調(diào)用函數(shù)中的變量。指針還可以用于實(shí)現(xiàn)鏈表、樹狀結(jié)構(gòu)、堆棧和隊(duì)列等數(shù)據(jù)結(jié)構(gòu)。

  三、句柄和指針之間的區(qū)別

  1. 句柄是一種特殊類型的指針,而指針可以指向任何類型的內(nèi)存塊。

  2. 句柄值很少直接使用,而是在API調(diào)用中使用,而指針可以在程序中直接使用。

  3. 句柄經(jīng)常用于在程序中實(shí)現(xiàn)對象引用,而指針主要用于動(dòng)態(tài)內(nèi)存管理和數(shù)據(jù)結(jié)構(gòu)。

  4. 句柄可以用于通過非托管代碼訪問托管對象,而指針不能這樣做。

  5. 句柄通常比指針更安全,因?yàn)樗鼈冸[藏了底層指針的細(xì)節(jié),從而可以減少出現(xiàn)錯(cuò)誤的機(jī)會,還可以通過顯式釋放句柄來避免內(nèi)存泄漏。

  四、總結(jié)

  句柄和指針是操作系統(tǒng)和編程語言中非常重要的概念。它們之間有許多相同之處,但在實(shí)際應(yīng)用中也有一些重要的不同點(diǎn)。在編寫程序時(shí),程序員必須正確地使用句柄和指針,以避免不良的內(nèi)存管理和不必要的程序異常。只有深入了解句柄和指針之間的區(qū)別,才能為程序設(shè)計(jì)帶來更大的靈活性和安全性,并且能夠正確地解決與內(nèi)存分配和管理相關(guān)的問題。



句柄是一種特殊的智能指針 。當(dāng)一個(gè)應(yīng)用程序要引用其他系統(tǒng)(如數(shù)據(jù)庫、操作系統(tǒng))所管理的內(nèi)存塊或?qū)ο髸r(shí),就要使用句柄。


句柄與普通指針的區(qū)別在于,指針包含的是引用對象的內(nèi)存地址,而句柄則是由系統(tǒng)所管理的引用標(biāo)識,該標(biāo)識可以被系統(tǒng)重新定位到一個(gè)內(nèi)存地址上。這種間接訪問對象的模式增強(qiáng)了系統(tǒng)對引用對象的控制。


句柄就是個(gè)數(shù)字,一般和當(dāng)前系統(tǒng)下的整數(shù)的位數(shù)一樣,比如32bit系統(tǒng)下就是4個(gè)字節(jié)。




? ? ? ?

這個(gè)數(shù)字是一個(gè)對象的唯一標(biāo)示,和對象一一對應(yīng)。? ? ? ?

這個(gè)對象可以是一個(gè)塊內(nèi)存,一個(gè)資源,或者一個(gè)服務(wù)的context(如 socket,thread)等等。? ? ?


?

這個(gè)數(shù)字的來源可以有很多中,只要能保證和它代表的對象保持唯一對應(yīng)就可以,比如可以用內(nèi)存地址,也可以用句柄表的序號,或者干脆用一個(gè)自增ID,再或者用以上的值去異或一個(gè)常數(shù)。


傳統(tǒng)上操作系統(tǒng)內(nèi)核和系統(tǒng)服務(wù)API都是 C 語言接口的,但是其內(nèi)部設(shè)計(jì)理念上又是OO的,所以有對象概念卻沒有對應(yīng)的語言語法支持。? ? ?


?

句柄的作用就是在 C 語言環(huán)境下代替 C++ 的對象指針來用的。? ? ? ?

創(chuàng)建句柄就是構(gòu)造,銷毀句柄就是析構(gòu),用句柄調(diào)用函數(shù)相當(dāng)于傳入this指針。? ? ? ?

如果有系統(tǒng)API是 C++ 接口的,那么就沒有句柄了,而是某個(gè)接口指針,IXXXPtr之類的,比如Windows的com ptr。


句柄和指針的區(qū)別

當(dāng)把硬盤上的資源調(diào)入內(nèi)存以后,將有一個(gè)句柄指向它,但是句柄只能指向一個(gè)資源。而且句柄知道所指的內(nèi)存有多大。還有指針,指針指向地址,它不知道分配的內(nèi)存有多大。


句柄是一個(gè)32位的整數(shù),實(shí)際上是windows在內(nèi)存中維護(hù)的一個(gè)對象(窗口等)內(nèi)存物理地址列表的整數(shù)索引。因?yàn)閣indows的內(nèi)存管理經(jīng)常會將當(dāng)前空閑對象的內(nèi)存釋放掉,當(dāng)需要時(shí)訪問再重新提交到物理存儲,所以對象的物理地址是變化的,不允許程序直接通過物理地址來訪問對象。


程序?qū)⑾朐L問的對象的句柄傳遞給系統(tǒng),系統(tǒng)根據(jù)句柄檢索自己維護(hù)的對象列表就能知道程序想訪問的對象及其物理地址了。句柄是一種指向指針的指針。我們知道,所謂指針是一種內(nèi)存地址。


應(yīng)用程序啟動(dòng)后,組成這個(gè)程序的各個(gè)對象是駐留在內(nèi)存的。如果簡單地理解,似乎我們只要獲知這個(gè)內(nèi)存的首地址,那么就可以隨時(shí)用這個(gè)地址訪問對象了。


但是,如果真這么認(rèn)為,那么就大錯(cuò)特錯(cuò)了。我們知道windows是一個(gè)虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng)。


在這種情況下,windows內(nèi)存管理器經(jīng)常在內(nèi)存中來回移動(dòng)對象,以此來滿足各種應(yīng)用程序的內(nèi)存需要,對象被移動(dòng)意味著它的地址變化了。如果地址總是如此的變化,我們應(yīng)該去那里找對象呢?為了解決這個(gè)問題,windows操作系統(tǒng)為各個(gè)應(yīng)用程序騰出一些內(nèi)存地址,用來專門登記各個(gè)應(yīng)用對象在內(nèi)存中的地址變化,而這個(gè)地址(存儲單元的位置)本身是不變的。


windows內(nèi)存管理器移動(dòng)對象在內(nèi)存中的位置后,把對象新的地址告知這個(gè)句柄地址來保存。這樣我們只需要記住這個(gè)句柄地址就可以間接地知道對象具體在內(nèi)存中哪個(gè)位置了。


這個(gè)地址是在對象裝載(load)時(shí)由系統(tǒng)分配的,當(dāng)系統(tǒng)卸載時(shí)又釋放給系統(tǒng)。句柄地址(穩(wěn)定)—–>記載著對象在內(nèi)存中的地址——–>對象在內(nèi)存中的地址(不穩(wěn)定)—–>實(shí)際對象。但是必須注意,程序每次重新啟動(dòng),系統(tǒng)不保證分配跟這個(gè)程序的句柄還是原來哪個(gè)句柄,而絕大多數(shù)情況下的確不一樣。假如我們把進(jìn)入電影院看電影看成是一個(gè)應(yīng)用程序的啟動(dòng)運(yùn)行,那么系統(tǒng)給應(yīng)用程序分配的句柄總是不一樣,這和每次電影院給我們的門票總是不同的座位是一個(gè)道理。


因此,句柄和指針其實(shí)是兩個(gè)截然不同的概念。windows系統(tǒng)用句柄標(biāo)記系統(tǒng)資源,用句柄隱藏系統(tǒng)信息。你只需要知道有這個(gè)東西,然后去調(diào)用它就行了,它是32bit的uint。指針則標(biāo)記某個(gè)物理內(nèi)存的地址,是不同的概念。


指針對應(yīng)著一個(gè)數(shù)據(jù)在內(nèi)存中的地址,得到了指針就可以自由地修改該數(shù)據(jù)。Windows并不希望一般程序修改其內(nèi)部數(shù)據(jù)結(jié)構(gòu),因?yàn)檫@樣太不安全。所以Windows給每個(gè)使用GlobalAlloc等函數(shù)聲明的內(nèi)存區(qū)域指定一個(gè)句柄(本質(zhì)上仍是一個(gè)指針,但不要直接操作它),平時(shí)你只是在調(diào)用API函數(shù)時(shí)利用這個(gè)句柄來說明要操作哪段內(nèi)存。當(dāng)你需要對某個(gè)內(nèi)存進(jìn)行直接操作時(shí),可以使用GlobalLock鎖住這段內(nèi)存并獲得指針來直接進(jìn)行操作。


句柄是指針的“指針”,使用句柄主要是為了利于windows在進(jìn)程內(nèi)存地址空間移動(dòng)分配的內(nèi)存塊,以防止進(jìn)程的內(nèi)存空間被撕的四分五裂而存在過多的碎片。


句柄是一些表的索引也就是指向指針的指針。間接的引用對象,windows可以修改對象的”物理”地址和?描述器的值,但是句柄的值是不變的。


句柄可以在獲得窗口的時(shí)候使用,指針可以進(jìn)行調(diào)用窗口,兩個(gè)使用的地方不一樣.一個(gè)括號外,一個(gè)括號內(nèi).


隱喻

CSDN上有人說過:牧童遙指杏花村。? ? ? ?

牧童的手為指針,杏花村的牌子為句柄,杏花村酒店為對象的實(shí)例.? ? ? ??

句柄是資源在創(chuàng)建過程中由Windows賦予的,它就是代表這個(gè)資源的。


而指針實(shí)質(zhì)上是某個(gè)變量或者對象所在內(nèi)存位置的首地址,是指向?qū)ο蟮摹?/p>


一個(gè)是指向,一個(gè)是代表,二者是不同的。


一個(gè)是直接找到對象(指針),一個(gè)是間接找到對象(句柄)。


例如,杏花村可以搬家(實(shí)際上程序運(yùn)行過程中,資源在內(nèi)存中的地址是變化的),那么牧童的手的指向也就不同(指針)了,然而即使搬了家,“杏花村”這塊牌匾是不變的,通過打聽“杏花村”這個(gè)名稱,還是可以間接找到它的(地址)。


HANDLE的本意是把柄,把手的意思,是你與操作系統(tǒng)打交道的東東。






句柄與指針的區(qū)別的評論 (共 條)

分享到微博請遵守國家法律
汉川市| 广丰县| 湘潭市| 确山县| 湘阴县| 合山市| 崇文区| 武冈市| 黄浦区| 读书| 读书| 赣州市| 南昌县| 北碚区| 山西省| 彭山县| 临湘市| 和硕县| 嵩明县| 西吉县| 炉霍县| 濮阳市| 宁德市| 高密市| 乌拉特前旗| 阆中市| 新兴县| 土默特左旗| 六盘水市| 长兴县| 柳林县| 紫金县| 仁布县| 开远市| 渭南市| 镇远县| 高雄市| 兴化市| 东平县| 巴林左旗| 会昌县|