24

最近、構造体へのポインタをハンドルと呼んでいる個人のホワイトペーパーを読みました。作者は明らかに、以前にWindowsプラットフォームでCコードを書いたことがある人でした。グーグルは、Windowsプログラマーがハンドルを介してシステムコンポーネントと対話することを示します。Windowsプログラマーがすべての構造体ポインターをハンドルとして参照するのが一般的な方法であるかどうか疑問に思っていますか?それとも、ハンドルという用語は、構造体へのポインターを超えた何かを伝えることを意味していますか?私はLinuxCプログラマーとして質問しています。

私が言及しているホワイトペーパーは、Duff、Heroux、およびPozoです。スパース基本線形代数サブプログラムの概要:BLASテクニカルフォーラムの新しい標準。ACM Transactions on Mathematical Software、Vol 28、No. 2、June 2002、Pages239-267。

4

16 に答える 16

49

ハンドルという用語は、一般に、それを生成したAPIにのみ意味を持つ不透明な値を意味します。Win32では、HANDLE型は、カーネルメモリ内のポインタ(アプリケーションはとにかくアクセスできません)またはカーネル内部配列へのインデックスのいずれかです。

于 2009-12-17T18:23:09.667 に答える
22

ハンドルは古くて尊敬されているコンセプトです。

クッキーもほとんど同じです。またはGUID。または、駐車場から車を回収するためのチケット、または高級レストランからコートを取得するためのチケットなど。

発行者に提示されたときに、発行者が望む不透明なメカニズムによって、参照された実際のものを追跡するために使用できる、その固有の値。 あなたはそのプロセスについて何も知らないかもしれませんし、根底にあるものが何であるかを正確に(概念的にのみ)知っているかもしれません。

これはWindowsで頻繁に使用されていましたが、確かにWindowsに固有のものではありません。

通常、「ハンドル」を「構造体へのポインタ」を意味するために使用することはありません。ハンドルは「ポインター」というより「トークン」に似ています。これは、ファイル、システムリソース、メモリ、状態スナップショットなどの何かを指します。しかし、正確には、ハンドル自体のコンテキスト(つまり、ハンドルを発行した人)に基づいています。

ハンドルは、K&RCの初期のファイルシステムプログラミングでも頻繁に使用されていました。

于 2009-12-17T18:26:00.103 に答える
13

私はハンドルという言葉を使用して、リソースを表す「オブジェクト」を指すポインターを意味します。多くの場合、OSリソースですが、ポインターは単にメモリを指します。何かへのハンドルがある場合は、バイトを直接読み書きしようとするのではなく、提供されているメソッドを使用して操作する必要があります。

多くの場合、ハンドルは不透明として実装されますvoid *。これは、ハンドルを直接逆参照しないようにすることをさらに推奨します。

于 2009-12-17T18:21:03.977 に答える
10

Windowsプログラマーが使用するように、構造体へのポインターとして使用されているハンドルを参照しているので、そのコンテキスト内で回答します。コンピューティング環境で広く使用されている一般的な概念であるため、明らかに多くの異なる種類の「ハンドル」があることに注意してください。確かに、ファイルハンドルの概念に精通しているでしょう。Windowsには、ウィンドウハンドルやその他の多くの種類のハンドルも用意されています。そうは言っても:

「メモリハンドル」(構造体へのポインタに似ています)は、16ビットWindowsプログラミングの世界からの概念であり、CPUにメモリマネージャがなく、すべてのメモリ管理をソフトウェアで行う必要がありました。基本的に、「ハンドル」は一種のポインタでしたが、OSは、ハンドルが参照するメモリ内を自由に移動できます。通常のポインタではそれを行うことはできませんが、ハンドルには実際のメモリアドレスを取得して解放する関数がありました。

CPUにハードウェアメモリマネージャが搭載されていたWin32の導入により、メモリハンドルの概念は廃止されました。Win32には、ファイルハンドルやウィンドウハンドルなどの他の種類のハンドルがまだ存在しますが、構造体へのポインタではありません。

于 2009-12-17T18:20:12.997 に答える
3

ハンドルという用語は、別のオブジェクトにアクセスできるようにするあらゆる手法を意味するために使用されます。ハンドルは、ポインター、参照、ポインターへのポインターなどにすることができます。ただし、クラス、オブジェクトなどに関連していることを確認してください。したがって、ハンドルは必ずしも構造体へのポインターである必要はありません。

-広告。

于 2009-12-17T18:24:07.800 に答える
3

「ハンドル」という用語は、Windowsプログラマーの間で広まったものの、Windowsでは生まれませんでした。

C標準ライブラリ(stdio.h)では、ファイルハンドルはCライブラリで使用されるデータ構造へのポインタです。

純粋なUnixプログラミングでは、カーネルデータ構造へのインデックスであるファイル記述子を使用しますが、ポインタは30年以上にわたってUnixのハンドルとして使用されてきました。

于 2009-12-17T18:27:14.760 に答える
3

「ハンドル」は論理的な用語であり、物理的な用語ではありません。これは、オブジェクトに関するより深い知識を持つコードへの物理オブジェクトへのプロキシとして意図されています。構造体へのポインタはそのようなプロキシの1つですが、他にも多くの可能性があります。

于 2009-12-17T18:30:58.660 に答える
2

いいえ、Windowsプログラマーの間では、ポインターをハンドルと呼ぶことは特に一般的ではありませんが、そうすることも間違いではありません。「ハンドル」という用語は通常、何かにアクセスするために使用するものを表すために使用され、その意味ではすべてのポインターハンドルです(ただし、すべてのハンドルがポインターであるとは限りません)。Win32のハンドルは、通常はポインタではなく、内部OSテーブルへのインデックスであるAFAIKですが、これはWindowsの将来のバージョンで変更される可能性があります。

于 2009-12-17T18:25:18.120 に答える
2

MacOSプログラミングの昔、OSXの前は、ハンドルはポインターへのポインターでした。これにより、OSはユーザーのポインターを無効にすることなく物事を動かすことができました。指さされたオブジェクトが動かないと仮定できる時期についての規則がありましたが、私は覚えていません。

于 2009-12-17T18:26:29.120 に答える
2

ハンドルは、オブジェクトへの参照(特にC ++参照ではない)の総称です。

ポインタはオブジェクトを指すため、ハンドルのサブセットです。

データベースの外部キーもハンドルです。これは、他のテーブルのレコードを指しているためです。そしてそれはポインタではありません。

Windows API環境では、抽象用語ハンドルを使用して、クライアントに干渉することなく、テーブル、ポインター、またはその他のメソッドに整数を使用できるようにしました。IOW、抽象インターフェースを定義します。

要約すると、ハンドルは、整数インデックスやオブジェクトに関する詳細を含むオブジェクト(スマートポインターなど)など、ポインター以外のものにすることができます。

于 2009-12-17T18:30:19.550 に答える
1

実際には、ポインターは別の変数のアドレスを含む変数ですが、ハンドルはポインターへのポインター、つまり別のポインターのアドレスを含むポインターです。

int x=10;

int *a=&x;// this is a simple pointer

int *b=a;// this is a handle
于 2013-01-30T12:49:08.770 に答える
1

私はおそらくほとんどの回答者より年上で、初期(80年代後半)のMacintoshと16ビットと32ビットの両方のWindowsの両方でCで生きたコーディングを獲得しています。それらの古代(IBMメインフレームに256kのメモリーしかない場合)では、ハンドルは常にメモリー・ポインターへのポインター(またはテーブル・オフセット)でした。

以前の回答者が述べたように、これにより、プログラマーが使用する「ハンドル」を無効にすることなく、メモリブロックへのポインターのテーブルをOSで管理できるようになりました。残念ながら、ハンドルを使用している間、割り当てられたブロックが移動されないことをどのように保証したかを覚えていません。

于 2012-12-18T19:33:35.287 に答える
1

Windowsは多くのもののハンドルを定義します。それらは必ずしもポインタではありません-いくつかはポインタですが、他は特定のテーブルへのオフセットのようなものです。意図的に難読化されているものもあります。ウィンドウからデバイスコンテキスト、ビットマップなど、あらゆるものに対応するハンドルがあります。

いずれの場合も、ハンドルは通常、不透明(OPAQUE)型として意図されています。つまり、ハンドルの値については何も知らないはずです。ハンドルを使用してさまざまなタスクを実行できる一連の事前定義された操作のみです。C ++ / CLIには、ハンドルと呼ばれるポインタのようなオブジェクトもあると思います。ただし、不透明(OPAQUE)型に近いはずです。メモリが機能する場合は、それらに対してポインタ演算を実行することはできません

于 2009-12-17T18:24:47.760 に答える
1

ハンドルは通常、直接逆参照する必要のないポインターです。むしろ、基礎となる構造体を操作するAPI呼び出しにそれらを渡します。

歴史的にWindowsでは、ハンドルはポインターではありませんでした。使用する前にハンドルをロックしてポインターを取得し、使い終わったらロックを解除します(ポインターが無効になります)。ページングメモリの前の数日間、古い学校のWindowsは、ハンドルによってのみ参照されるリソースをスワップアウトし、ロックされたときにそれらをスワップインすることによって、独自のメモリ管理を行いました。実際には、これはメモリ管理を悪夢にしましたが、Windowsがハードウェアサポートなしでシステム上の仮想メモリをシミュレートすることを可能にしました。

于 2009-12-17T18:25:51.520 に答える
0

ポインタはハンドルとは明らかに異なります。ポインタは、メモリ内で指定されていないもののアドレスです。構造体へのポインタは「ハンドル」と呼ぶことができます(通常は「typedef」を使用します)。

ハンドルは、Windowsオペレーティングシステムの作成に使用される概念です。ポインタはC言語の一部です。

于 2009-12-17T18:22:58.207 に答える
0

ハンドルは数値であり、ポインターはハンドルではありません

// storage
char data[0xFFFF] = {0} ;

// pointer aka "iterator"
char * storage_pointer = & data[42];

// handle
size_t storage_handle = 42 ;

主な違い、またはハンドルの「利点」と呼びたい場合は、ハンドルが有効かどうか、または「ぶら下がり」という用語を好むかどうかを推測することができます。

可能な限りハンドルを使用します。これは、利点と実装方法に関する優れた記事です。

于 2021-01-18T07:31:48.113 に答える