句柄是什麼?

句柄在不同編程語言中的應用原則是一樣的么,它是用來做什麼的?能不能用形象的語言形容一下?


句柄就是個數字,一般和當前系統下的整數的位數一樣,比如32bit系統下就是4個位元組。

這個數字是一個對象的唯一標示,和對象一一對應。

這個對象可以是一個塊內存,一個資源,或者一個服務的context(如 socket,thread)等等。

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

傳統上操作系統內核和系統服務API都是 C 語言介面的,但是其內部設計理念上又是OO的,所以有對象概念卻沒有對應的語言語法支持。

句柄的作用就是在 C 語言環境下代替 C++ 的對象指針來用的。

創建句柄就是構造,銷毀句柄就是析構,用句柄調用函數相當於傳入this指針。

如果有系統API是 C++ 介面的,那麼就沒有句柄了,而是某個介面指針,IXXXPtr之類的,比如Windows的com ptr。


最早的windows開發書籍,handle是被翻譯成「把手」的。雖然不好聽,但是個人認為相當傳神。

1.雖然你握住的只是把手,卻能拉動整扇門,而且你根本不用在意那門長什麼樣子

2.一扇門如果有多個把手,被不同的人(進程)握住,門往哪兒走就不好說了


記得在某段視頻看到,一個帶柄的鍋,旁邊一個單詞,handle。然後視頻講道,handle是什麼意思,就是柄,鍋柄,我們拿東西都要拿著柄(這句好像沒有)。

鍋有柄,勺子有柄,柄就是那個把。

但是,翻譯的人認為,這樣翻譯不夠水平,於是,取名,句柄。。。

(現在你知道學號英文的重要性了吧。。。)


我記得似乎只有windows上有「句柄」這個名詞吧?

這東西就是一個數字,作用嘛,就和你去飯店吃飯要排隊,前台小姐給你分配了一個編號一樣,然後她可以通過編號找到你。

在操作系統或者某種其他編程系統中,句柄就是這樣的一個編號,用來對各種奇奇怪怪的東西編號,系統對你來說是一個黑箱,你只能通過這個編號向系統要東西。

所以說這種問題嘛。。你只要實現一個類似的系統就懂了


編號

如果當初把這個詞翻譯成"編號",那得省大家多少事啊。

文件編號

窗口編號

太容易理解了

一個古怪的辭彙,句柄,不知道嚇退了多少學習windows編程的人


其他人解釋的已經很易懂啦,我來解釋一下句柄存在的意義吧。

對於操作系統來說, 為程序提供服務,對資源的合理調度,讓一堆程序乖乖的一起運行不打架來說是很重要的的。

可要是程序能夠直接獲得內核對象的話不就可以為所欲為了嗎,那時候系統也只能幹瞪眼。但程序運行的時候又必須取得一些系統對象怎麼辦,行,來我這兒領你要操作對象的編號,要幹嘛附上編號告訴我,我操作系統幫你做。這個編號就是句柄,window上叫句柄,其他操作系統類似的東西可能叫其他名字,其實都是一種東西啦


跟unix中的文件描述符(fd)的作用類似


句柄跟C++中new得到的指針有一定相似,都是標識一個資源,但是指針或句柄本身的值沒太大意義,根據他你可以對他所代表的資源進行操作


深入了解Windows句柄到底是什麼 - 文洲的專欄 - 博客頻道 - CSDN.NET


我從Stanford Programming Paradigm這個在線課程看來的思路。網易公開課上也有。

簡單說,Handle就是指針的指針。

在c語言裡面,假如你通過malloc申請一段內存空間,heap給你一個指針直接指到你可用內存的起始位置。在你釋放之前操作系統無法將這段內存移動。

至於為啥要移動,因為你在程序各處調用大小不一的malloc會產生內存碎片。碎片多了總之不好,最好把碎片移到一塊,這樣就又有大塊的內存空間可以malloc了。這個過程叫defragmentation。跟windows上硬碟碎片整理一樣。

malloc直接給你指針的話就不方便heap管理內存。因為只要你不free,它就不敢動那塊內存。但是假如給你指針的指針,增加一次跳轉。動態內存管理內部維護一個表,第一次對指針dereference進入這個表,再來一次才到你可用的內存塊。這樣動態內存管理就可以把真正的那段內存定期合併起來,然後只要調整那個表指向新的地址。


用在語法分析上,是歸約句子時最先被歸約的短語。文法的句柄可以用語法分析樹判斷。


通俗來講就是標示一個進程的一串數字,系統靠他辨別一個進程


句柄就是一個結構體實例的一個指代,只要拿著這個「柄」,就可以操作對應的結構體實例。

句柄的使用沒有統一標準,一般都是函數庫為了實現方便,處理邏輯跟被處理的數據要分開,處理邏輯由庫來實現,用戶使用庫的時候通過傳入事先分配給用戶的句柄來提示庫應該操作哪一個結構體實例。這樣,每一個用戶的數據都是獨有的,但處理邏輯是統一的。

第二點,通過句柄,庫實現了內部數據結構的封裝,用戶只知道一個句柄,並不知道它指代的結構體的樣子,減少了用戶對庫的特定實現的依賴,降低耦合度。

第三,句柄也降低了用戶使用庫的難度,不管是調用庫中的哪個函數,都只要傳入句柄就可以了。不然,用戶還得區分調用哪個函數應該傳入什麼參數,對庫的內部邏輯不清楚的用戶很容易就搞錯,傳錯了參數了。

至於句柄(那一串數)到底是個什麼東西,我見過直接以內存地址為句柄給用戶用的,也見過以結構體實例數組的index為句柄的,也可能有哈希值(推想,沒見過)。我自己寫庫代碼,經常用index作為句柄。


哈哈,看了那麼多人的回答,我都有些蒙逼了,我也是才理解了這個意思,以前一直不明白為什麼handle要叫句柄。

首先我們來理解句柄到底什麼意思,拆字,句和柄,句就簡單理解一下,句子的意思,而柄,這個字確實有更深層次的理解,那就是把手,短處的意思,可以組合理解,也就是刀柄,匕柄,也是把手的意思。你可以理解為你要控制某樣東西,就得是捏住他的柄,他的短處。

句柄,顧名思義也就是一個句子的把手。

我們把這個概念傳遞到編程中以後,就能立刻知道,這是控制這一段程序的把手,再延伸一下,就成了標識,指針了。


句柄是常量還是變數?什麼情況下會調用,請大神們舉個最簡潔的程序應用例子。


看了樓上的解釋,我感覺和寄存器的地址差不多意思,不知道這麼理解對不對?


分頁阅读: 1 2