句柄是何物
最开始我听到这个词听起来像吃的,以为和语法糖同属一类。结果发现此柄非饼,从此这个词给我的感觉就是咯牙。
我在看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里的迭代器就是一种句柄,只不过迭代器更能描述好功能而已。还是看使用者以及程序设计者怎么定义吧,这本来就是个宽泛的名词。