pointeur vs poignées dans C (les termes sont-ils utilisés pour transmettre des choses séparées?)

Récemment, j’ai lu un livre blanc par un individu qui se réfère à un pointeur sur une structure en tant que handle. L’auteur était clairement quelqu’un qui avait déjà écrit du code C sur la plateforme Windows. Googling indique que les programmeurs Windows interagissent avec les composants du système via des poignées. Je me demande s’il est courant que les programmeurs Windows se réfèrent à tous les pointeurs de structure en tant que descripteurs? Ou est-ce que le terme “manipuler” a pour but de transmettre quelque chose au-delà du pointeur vers la structure? Je demande en tant que programmeur Linux C.

Le livre blanc auquel je fais référence est: Duff, Heroux et Pozo. Un aperçu des sous-programmes d’algèbre linéaire de base épars: la nouvelle norme du forum technique BLAS. Transactions ACM sur les logiciels mathématiques, Vol 28, No. 2, juin 2002, pages 239-267.

Le terme handle signifie généralement une valeur opaque qui n’a de sens que pour l’API qui l’a produite. Dans Win32, le type HANDLE est soit un pointeur dans la mémoire du kernel (quelles applications ne peuvent en aucun cas accéder) ou un index dans un tableau interne au kernel.

Un manche est un concept ancien et révéré.

Un cookie est à peu près la même chose. Ou un GUID. Ou un ticket pour récupérer votre voiture depuis un parking, ou votre manteau depuis un restaurant chic, etc.

Sa valeur unique qui, une fois présentée à l’émetteur, peut être utilisée pour retracer la chose réelle visée, quel que soit le mécanisme opaque souhaité par l’émetteur. Vous pouvez ou ne pouvez pas savoir quelque chose sur ce processus, ni quelle est la chose sous-jacente, exactement (seulement conceptuellement).

Il était très utilisé par Windows, mais il n’est certainement pas propre à Windows.

Vous ne devriez normalement pas utiliser “handle” pour signifier “pointeur vers struct”. Handle est plus comme “jeton” que comme “pointeur”. Il fait référence à quelque chose – fichier, ressource système, mémoire, capture d’état, etc.

Les poignées ont également été largement utilisées dans les premiers programmes de systèmes de fichiers dans K & R C.

J’utilise le mot handle pour désigner un pointeur qui pointe vers un “object” qui représente une ressource – souvent une ressource de système d’exploitation, alors qu’un pointeur pointe simplement vers une certaine mémoire. Si vous avez un handle vers quelque chose, vous ne devriez pas essayer de lire et d’écrire des octets directement dans celui-ci, mais le manipuler par les méthodes fournies.

Souvent, les poignées sont implémentées comme un void * opaque void * , ce qui constitue un encouragement supplémentaire à ne pas essayer de le modifier directement.

Puisque vous faites référence aux poignées utilisées comme pointeur vers une structure, telle qu’utilisée par un programmeur Windows, je répondrai dans ce contexte. Veuillez noter qu’il existe clairement de nombreux types de “handles”, car il s’agit d’un concept générique largement utilisé dans l’environnement informatique. Vous serez certainement familier avec le concept de descripteur de fichier; Windows propose également des poignées de fenêtre et de nombreux autres types de poignées. Ayant dit cela:

Un “handle de mémoire” (similaire à un pointeur sur une structure) est un concept de la programmation Windows 16 bits, où il n’y avait pas de gestionnaire de mémoire dans le CPU et toute la gestion de la mémoire devait être effectuée dans un logiciel. Essentiellement, un “handle” était en quelque sorte un pointeur, mais le système d’exploitation serait libre de se déplacer dans la mémoire à laquelle le handle faisait référence. Vous ne pouvez pas faire cela avec un pointeur normal, mais le handle a des fonctions qui obtiendraient et libéreraient l’adresse mémoire réelle .

Avec l’introduction de Win32, où le CPU disposait d’un gestionnaire de mémoire matérielle, le concept du handle de mémoire devenait obsolète. D’autres types de descripteurs, tels que les descripteurs de fichiers et les descripteurs de fenêtres, existent toujours dans Win32, mais ne constituent pas des pointeurs vers les structures.

Le terme handle est utilisé pour désigner toute technique qui vous permet d’accéder à un autre object. Un handle peut être un pointeur, une référence, un pointeur sur un pointeur, etc. Mais, bien sûr, il est lié aux classes, aux objects, etc. Donc handle ne doit pas toujours être un pointeur sur la structure.

-UN D.

Le terme “handle” ne s’inscrit pas sous Windows, bien qu’il soit devenu très répandu chez les programmeurs Windows.

Dans la bibliothèque standard C (stdio.h), les descripteurs de fichiers sont des pointeurs vers une structure de données utilisée par la bibliothèque C.

La programmation de Pure Unix utilise des descripteurs de fichiers, qui sont des index dans une structure de données du kernel, mais les pointeurs ont été utilisés comme descripteurs dans Unix depuis plus de 30 ans.

“Handle” est un terme logique et non physique. Il est conçu comme un proxy pour un object physique à coder qui a une connaissance plus intime de l’object. Un pointeur sur une structure est un tel proxy, mais il existe de nombreuses autres possibilités.

Non, il n’est pas particulièrement courant chez les programmeurs Windows de se référer à des pointeurs comme des poignées, mais ce n’est pas le cas non plus. Le terme “handle” est généralement utilisé pour décrire quelque chose que vous utilisez pour accéder à quelque chose, et dans ce sens, tous les pointeurs sont manipulés (mais tous les descripteurs ne sont pas des pointeurs). Les descripteurs de Win32 ne sont généralement pas des pointeurs, mais des index sur les tables internes du système d’exploitation – mais cela pourrait changer dans les futures versions de Windows.

Dans l’ancien temps de la programmation MacOS, avant OSX, un handle était un pointeur sur un pointeur. Cela a permis au système d’exploitation de déplacer les choses sans invalider les pointeurs de l’utilisateur. Il y avait des règles sur le moment où l’on pouvait supposer que l’object pointé ne bougerait pas, ce dont je ne me souviens pas.

Un handle est un terme générique pour une référence (pas spécifiquement une référence C ++) à un object.

Un pointeur est un sous-ensemble de handle , car il pointe vers des objects.

Une clé étrangère dans une firebase database est également un handle, car elle pointe vers des enregistrements dans d’autres tables; et ce n’est pas un pointeur.

Dans l’environnement API Windows, ils utilisaient le terme de terme abstrait pour pouvoir utiliser un entier dans une table, un pointeur ou d’autres méthodes, sans interférer avec le client; IOW, définissant une interface abstraite.

En résumé, un handle peut être autre chose qu’un pointeur, tel qu’un index entier ou un object contenant plus de détails sur l’object (comme un pointeur intelligent).

Windows définit des poignées pour beaucoup de choses. Ils ne sont pas nécessairement des pointeurs du tout – certains le sont, mais d’autres sont des choses comme les décalages dans des tableaux particuliers. Quelques-uns sont intentionnellement obscurcis. Il existe des poignées pour tout, des fenêtres aux contextes de périphériques, en passant par les bitmaps, etc.

Dans tous les cas, un handle est normalement conçu comme un type de données opaque – c’est-à-dire que vous n’êtes pas censé connaître sa valeur, mais uniquement un ensemble d’opérations prédéfinies qui peuvent être utilisées pour accomplir diverses tâches. Je crois que C ++ / CLI a également un object de type pointeur appelé “handle”. Je crois que c’est supposé être plus proche d’un type de données opaque si – si la mémoire sert, vous n’êtes pas autorisé à faire de l’arithmétique de pointeur sur eux.

Les poignées sont généralement des pointeurs que vous n’avez pas besoin de déréférencer directement. Au lieu de cela, vous les transmettez aux appels API qui opèrent sur les structures sous-jacentes.

Historiquement, sous Windows, les poignées n’étaient pas des pointeurs. Vous devez verrouiller la poignée pour obtenir un pointeur avant de l’utiliser, et le déverrouiller lorsque vous avez terminé (et que le pointeur devient invalide). Dans les jours précédant la mémoire paginée, l’ancienne Windows faisait sa propre gestion de la mémoire en remplaçant les ressources uniquement référencées par des poignées et les échangeait lorsqu’elles étaient verrouillées. En pratique, cela a rendu la gestion de la mémoire un cauchemar, mais a permis à Windows de simuler la mémoire virtuelle sur des systèmes sans support matériel.

Un pointeur est définitivement différent d’une poignée. Un pointeur est une adresse de quelque chose de non spécifié en mémoire. Un pointeur sur une structure peut être appelé “handle” (généralement en utilisant “typedef”).

Un handle est un concept utilisé pour écrire le système d’exploitation Windows. Un pointeur fait partie du langage C.

Je suis probablement plus âgé que la plupart des personnes interrogées, ayant gagné une vie en codage en C à la fois sur les premiers Macintosh (fin des années 80) et sur les Windows 16 et 32 ​​bits. Dans les temps anciens (lorsqu’un ordinateur central IBM pouvait avoir seulement 256 Ko de mémoire), un handle était toujours un pointeur (ou un décalage de table) vers un pointeur de mémoire.

Comme mentionné précédemment, les systèmes de pointeurs vers des blocs de mémoire peuvent être gérés par le système d’exploitation sans invalider les “descripteurs” utilisés par le programmeur. Malheureusement, je ne me souviens pas comment nous avons garanti qu’un bloc alloué ne serait pas déplacé pendant que nous utilisions le handle.

En fait, un pointeur est une variable qui contient l’adresse d’une autre variable, mais un handle est un pointeur sur un pointeur, c’est-à-dire un pointeur qui contient l’adresse d’un autre pointeur FOR EX:

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