我已阅读此article并遇到以下
资源句柄可以是不透明的标识符,在这种情况下它是 通常是整数(通常是数组中的数组索引或“表”) 用于管理该类型的资源),或者它可以是指针 允许访问更多信息。
因此句柄是不透明的标识符或允许访问更多信息的指针。但据我所知,这些特定指针是不透明指针,那么这些指针(不透明指针)和不透明标识符之间究竟有什么区别?
答案 0 :(得分:1)
" opaque"的一个字面含义是"不透明"。
在计算机科学中,不透明的标识符或句柄是不暴露其内部细节的标识符。这意味着我们只能通过使用某些已定义的接口来访问它的信息,否则无法访问有关其值(如果有)或内部结构的信息。
例如,C标准库中的FILE
(在C ++中通过<cstdio>
提供)是一种不透明的类型。我们不知道它是数据结构,整数还是其他任何东西。我们所知道的是,一组函数,如fopen()
,返回一个指针(即FILE *
)和其他函数(fclose()
,fprintf()
,.... )接受FILE *
作为参数。如果我们有FILE *
,我们就无法可靠地对它做任何事情(例如实际写入文件),除非我们使用这些函数。
这样做的好处是它允许不同的实现使用不同的表示文件的方式。只要我们的代码使用提供的函数,我们就不必担心FILE
或I / O函数的内部工作。编译器供应商(或标准库的实现者)担心正确获取内部细节。我们只使用opaque类型FILE
,并指向它,并坚持使用标准函数,我们的代码适用于所有实现(编译器,标准库版本,主机系统)
不透明标识符可以是任何类型。它可以是整数,指针,甚至指向指针的指针,也可以是数据结构。整数和指针是常见的选择,但不是唯一的选择。关键是只使用一组定义的操作(即特定的接口)与这些标识符进行交互,而不是通过播放内部细节来弄清楚。
答案 1 :(得分:0)
你过度分析了。
不透明标识符通常是指针或整数。这就是它的全部含义。
答案 2 :(得分:0)
据说手柄是不透明的&#34;当客户端代码不知道如何查看它引用的内容时。它只是一些可用于识别某事物的标识符。通常,它将是指向不完整类型的指针,该指针仅在库中定义,并且客户端代码的定义不可见。或者它可能只是一个引用某些数据结构中某个元素的整数。重要的是客户不知道或不关心句柄是什么。客户端只关心它唯一标识某些资源。
考虑以下界面:
widget_handle create_widget();
void do_a_thing(widget_handle);
void destroy_widget(widget_handle);
在这里,调用代码实际上并不重要widget_handle
是什么,库实际存储小部件的方式,或者库实际上如何使用widget_handle
来查找特定小部件。它可以是指向窗口小部件的指针,也可以是某些全局窗口小部件的索引。来电者不在乎。重要的是它以某种方式识别小部件。
答案 3 :(得分:0)
一个可能的区别是整数句柄可以有“特殊”值,而指针句柄则不能。
例如,文件描述符0,1,2是stdin,stdout,stderr。如果你有一个句柄指针,这将很难实现。
答案 4 :(得分:0)
你真的不应该关心。他们可能就是一切。
假设您从A人那里购买活动门票。您必须将此票证交给B人才能访问该活动。
机票的性质与您无关,可能是:
你不在乎。只有A和B才会使用机票,因为它只是随身携带。只有B知道如何验证有效性,只有A知道如何发出正确的票证。
不透明指针可以直接作为内存位置,而整数可以是表中基本内存地址的偏移量,但与不透明句柄的客户端有什么关系呢?
答案 5 :(得分:0)
在经典Mac OS memory management中,句柄是双向间接指针。句柄指向“主指针”,它是实际数据的地址。这允许在内存中移动对象的实际存储。移动块时,内存管理器将更新其主指针。
为了使用最终引用的句柄数据,必须锁定句柄,这样可以防止它被移动。 (在系统中几乎没有并发性,所以除非有人调用操作系统或库,否则也可能依赖于内存不会被移动。这样做有点危险,但是代码经常演变为调用可以移动内存的东西不期望的地方。)
在此设计中,句柄是指针,但不是不透明类型。通用句柄是C中的void **
,但通常有一个有类型句柄。如果你看here,你会发现许多更具体的句柄类型。例如。 StringHandle
。