1

我正在编写一个类库,为 Windows 注册表的 C API 提供方便的面向对象前端。然而,我很好奇,处理HREGs 的最佳做法是什么,例如我的key类被复制的情况。

我可以

  1. 分配一个堆整数并将其用作引用计数。在句柄上调用 RegCloseKey() 并在引用计数为零时释放整数。
  2. 使用句柄的内置功能,而不是维护引用计数,而是DuplicateHandle()在复制注册表项对象时调用 HREG。然后总是在析构函数中调用 RegCloseKey。

DuplicateHandle()设计要简单得多,但我担心以这种方式设计的东西是否会严重影响应用程序的性能。因为我的应用程序通过数十万个键进行递归,所以复制此对象的速度是一个敏感问题。

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

4

2 回答 2

1

我从未遇到过任何DuplicateHandle()具有意外开销的暗示。

我怀疑一些科学实验是为了证实这一点。请务必在多个平台上执行此操作,因为这是 Microsoft 可能会在没有警告的情况下更改的内容。

于 2009-11-16T18:44:22.497 回答
1

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

如果您同时打开数十万个对象,您可能会遇到困难这取决于 Windows 感觉让您打开多少句柄。

于 2009-11-16T18:45:11.947 回答