DuplicateHandle的价格

时间:2009-11-16 18:37:27

标签: c++ windows raii

我正在编写一个类库,它为Windows注册表的C API提供方便的面向对象的前端。然而,我很好奇,对于处理HREG的最佳行动方案,我的key类被复制了。

我可以

  1. 分配一个堆整数并将其用作引用计数。在句柄上调用RegCloseKey()并在引用计数等于零时释放整数。
  2. 使用句柄的内置功能,而不是维护引用计数,在复制注册表项对象时在HREG上调用DuplicateHandle()。然后总是在析构函数中调用RegCloseKey。
  3. DuplicateHandle()设计要简单得多,但我担心如果设计这样会严重妨碍应用程序的性能。因为我的应用程序通过数十万个密钥进行递归,所以复制此对象的速度是一个敏感问题。

    DuplicateHandle()函数的固有开销是什么?

2 个答案:

答案 0 :(得分:1)

我从来没有遇到DuplicateHandle()意外开销的任何暗示。

我怀疑有一些科学实验是为了证实这一点。一定要在多个平台上执行此操作,因为这可能是微软可能在没有警告的情况下改变的。

答案 1 :(得分:1)

我怀疑你会发现DuplicateHandle的开销很小。内核已经管理了每个打开对象的引用计数,DuplicateHandle为目标进程的内核句柄表添加了一个新条目,并递增了对象引用计数。 (DuplicateHandle通常也会执行安全检查,但如果源和目标进程相同,它可能会跳过它。)

如果您同时打开数十万个对象,可能会遇到困难,具体取决于Windows让您打开的句柄数量。