句柄是何物

最开始我听到这个词听起来像吃的,以为和语法糖同属一类。结果发现此柄非饼,从此这个词给我的感觉就是咯牙。

我在看UE的源码的时候以及看一些其他工程代码的时候看到了非常多的Handle,但是一直没有搞清楚它的设计以及用法。之前写dx12的时候,比如

1
static void ImGui::DockSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*)

动不动Handle,Handler。经常和指针搞不清楚。

我目前认为它就是指针的包装?比如智能指针这些类就是包装了原始指针,那么它们是不是也能叫句柄。那标准库的迭代器是不是也是句柄。这些东西感觉在win编程里尤其多,什么文件句柄,窗口句柄等等。

下面列出一些我搜到的答案:

句柄一种指针,它通常是引用某个实体的一种方式。

更准确的说法是,指针是句柄的一种类型,但并非所有句柄都是指针。

例如,句柄也可以是内存表中的某个索引,该索引对应于一个条目,该条目本身包含指向某个对象的指针。

关键在于,当你拥有一个“句柄”时,你既不知道也不关心这个句柄最终是如何识别它所识别的事物的,你只需要知道它确实识别了它所识别的事物即可。

显然,“句柄究竟是什么”这个问题并没有统一的答案,因为即使在同一个系统中,指向不同对象的句柄在“底层”的实现方式也可能不同。但你无需关心这些差异。

这个讲到了不透明指针:https://en.wikibooks.org/wiki/C%2B%2B_Programming/Idioms#Pointer_To_Implementation_(pImpl)

还有其他理解:

指针是句柄的一种特殊情况。指针的优点在于它可以直接标识内存中的对象,但代价是对象不可重定位。句柄则抽象了对象在内存中的位置,但访问它需要额外的上下文信息。例如,如果句柄被定义为数组索引,我们需要一个数组基址指针来计算数组元素的地址。有时,上下文信息在调用点是隐式的,例如当对象池是全局的时。这使得我们可以优化句柄的大小和使用方式,例如使用 16 位整数而不是 64 位指针。

这个youtube视频讲得挺好:A Introduction to Handles (in C++)

https://youtu.be/BQC5WH_t-Uc?si=FqTXAwjhIj21NSKi

总之看下来,这个概念很宽泛,每个语言的术语也不太一样,但总的来说,可以这么理解:句柄就是能让你访问到资源或者你想要知道的对象,但是又包装了实现细节,我感觉stl里的迭代器就是一种句柄,只不过迭代器更能描述好功能而已。还是看使用者以及程序设计者怎么定义吧,这本来就是个宽泛的名词。