我正在编写一个类库,该类库为Windows注册表的C API提供了方便的面向对象的前端。但是,我很好奇,对于复制HREG类的实例,处理key的最佳方法是什么。

我可以

  • 分配堆整数并将其用作引用计数。调用句柄上的RegCloseKey(),并在引用计数等于零时取消分配整数。
  • 使用句柄的内置功能,而不是维护引用计数,而是在复制注册表项对象时在HREG上调用DuplicateHandle()。然后始终在析构函数中调用RegCloseKey。
  • DuplicateHandle()设计要简单得多,但是我担心这样设计是否会严重影响应用程序的性能。因为我的应用程序通过成千上万的键递归,所以复制该对象的速度是一个敏感的问题。
    DuplicateHandle()函数的固有开销是多少?

    最佳答案

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

    如果同时打开数十万个对象,可能会遇到麻烦,具体取决于Windows允许您打开多少个句柄。

    关于c++ - DuplicateHandle的价格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1744016/

    10-14 17:49