我正在编写一个类库,它为Windows注册表的C API提供方便的面向对象的前端。然而,我很好奇,对于处理HREG
的最佳行动方案,我的key
类被复制了。
我可以
DuplicateHandle()
。然后总是在析构函数中调用RegCloseKey。 DuplicateHandle()
设计要简单得多,但我担心如果设计这样会严重妨碍应用程序的性能。因为我的应用程序通过数十万个密钥进行递归,所以复制此对象的速度是一个敏感问题。
DuplicateHandle()
函数的固有开销是什么?
答案 0 :(得分:1)
我从来没有遇到DuplicateHandle()
意外开销的任何暗示。
我怀疑有一些科学实验是为了证实这一点。一定要在多个平台上执行此操作,因为这可能是微软可能在没有警告的情况下改变的。
答案 1 :(得分:1)
我怀疑你会发现DuplicateHandle的开销很小。内核已经管理了每个打开对象的引用计数,DuplicateHandle为目标进程的内核句柄表添加了一个新条目,并递增了对象引用计数。 (DuplicateHandle通常也会执行安全检查,但如果源和目标进程相同,它可能会跳过它。)
如果您同时打开数十万个对象,可能会遇到困难,具体取决于Windows让您打开的句柄数量。