1

Windows レジストリである C API に便利なオブジェクト指向フロントエンドを提供するクラス ライブラリを作成しています。ただし、クラスがコピーされたHREG場合など、 sを処理するための最善の方法は何ですか。key

どちらでもいい

  1. ヒープ整数を割り当て、それを参照カウントとして使用します。ハンドルで RegCloseKey() を呼び出し、参照カウントが 0 のときに整数の割り当てを解除します。
  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 に答える