À quoi servent-const pointeurs (par opposition à des pointeurs vers des objets const)?
J'ai souvent utilisé des pointeurs vers des objets const, comme si...
const int *p;
Qui signifie simplement que vous ne pouvez pas changer le nombre entier qui p
pointe à travers p
. Mais j'ai aussi vu de référence à const pointeurs, déclarée comme telle...
int* const p;
Si je comprends bien, cela signifie que le pointeur de variable lui-même est constant -- vous pouvez modifier le nombre entier il des points à tout au long de la journée, mais vous ne pouvez pas le faire pointer quelque chose d'autre.
Ce possible d'utiliser cela aurait-il?
Vous devez vous connecter pour publier un commentaire.
Lorsque vous êtes en train de concevoir des programmes en C pour les systèmes embarqués, ou à des fins spéciales des programmes qui ont besoin de se référer à la même mémoire (multi-processeur d'applications de partage de mémoire), alors vous avez besoin constant de pointeurs.
Par exemple, j'ai un 32 bits processeur MIPs qui a un peu à écran LCD attaché à elle. Je dois écrire mon écran LCD de données vers un port spécifique de la mémoire, qui est ensuite envoyé au contrôleur de l'écran LCD.
Je pourrais #define nombre, mais j'ai aussi d'avoir à jeter comme un pointeur, et le compilateur C n'a pas beaucoup d'options quand je le fais.
De plus, j'ai peut-être besoin d'être volatile, qui peut aussi être lancé, mais il est plus facile et plus clair d'utiliser la syntaxe fournie - const pointeur vers une mémoire volatile de l'emplacement.
Pour les programmes de PC, voici un exemple: Si vous concevez DOS VGA jeux (il y a des tutoriels en ligne qui sont amusants pour apprendre les rudiments de bas niveau graphique), alors vous avez besoin pour écrire sur le VGA de la mémoire, qui peut être référencé comme un décalage à partir d'un pointeur const.
-Adam
barrier()
et d'autres sémantique en fonction de l'appareil. Il est vrai que vous avez besoin pour gérer les valeurs soigneusement. C'est à dire, cache/no-cache, barrière, etc. Il dépend du type d'appareil et volatile n'est pas toujours la meilleure option.volatile
devrait certainement être là; d'autre part, de nombreux éditeurs de compilateurs " en-têtes ne semble pas déranger-un fait qui peut être un peu ennuyeux (même si les compilateurs généralement de faire la bonne chose, ils peuvent ignorer les tentatives de lire un registre mais ne rien faire avec le résultat).Il permet de protéger le pointeur d'être changé. Cela signifie que vous pouvez protéger les hypothèses que vous faites en fonction du pointeur ne jamais changer ou de toute modification non intentionnelle, par exemple:
const uint8 *const value
. Il déclare que le pointeur et la valeur des points ne sont pas modifiables (mais peut l'être si coulé).un autre exemple:
si vous savez où il a été initialisé, vous pouvez éviter à l'avenir NULL contrôles.
Le compilateur garantit que le pointeur n'a jamais changé (NULL)...
En toute non-const C++ fonction de membre de la
this
pointeur est de typeC * const
, oùC
est le type de classe -- vous pouvez modifier ce qu'il désigne (c'est à dire de ses membres), mais vous ne pouvez pas le changer pour pointer vers un autre exemple d'unC
. Pourconst
fonctions de membre,this
est de typeconst C * const
. Il y a aussi (rarement rencontrée)volatile
etconst volatile
fonctions de membre de, pour quithis
a aussi levolatile
qualificatif.À usage unique est dans les bas-niveau (pilote de périphérique ou intégrés) code où vous avez besoin de faire référence à une adresse spécifique qui est mappé à un périphérique d'entrée/sortie comme une broche matériel. Certaines langues, vous permettent de lier des variables à des adresses spécifiques (par exemple, Ada a
use at
). En C, la plus idiomatique façon de le faire est de déclarer un pointeur constant. Notez que ces usages doivent aussi avoir lavolatile
qualificatif.D'autres fois c'est juste défensive de codage. Si vous avez un pointeur qui ne devrait pas changement, il est sage de le déclarer tel qu'il ne peut pas changement. Cela permettra au compilateur (et lint) afin de détecter les tentatives erronées de la modifier.
J'ai toujours utilisé quand j'ai voulu éviter les imprévus de la modification du pointeur (comme l'arithmétique des pointeurs, ou à l'intérieur d'une fonction). Vous pouvez également les utiliser pour Singleton modèles.
"il" est codé en dur pointeur constant.
Même comme un "const int" ... si le compilateur sait qu'il ne va pas changer, il peut être l'optimisation des hypothèses fondées sur que.
Maintenant, le compilateur pourrait faire un peu afin d'optimiser cette boucle --- à condition qu'il sait que SomeOtherFunc() ne change pas la valeur de ptr. Avec le const, le compilateur sait que, et peut faire des hypothèses. Sans elle, le compilateur a supposer que SomeOtherFunc va changer ptr.
const
question de l'optimisation? Tout habile compilateur peut déterminer si vous modifiez une variable, et de l'optimiser si l'on peut sur cette base, si oui ou non vous dit vous voulez.ptr
est un membre du public. Il est très difficile pour un compilateur pour le suivi de l'utilisation d'une variable publique entre les modules. Beaucoup même ne pas essayer, et juste le traiter comme unvolatile
2) les Compilateurs ont été dumber il y a 9 ans.J'ai vu certains OLE du code où vous il y avait un objet transmis de l'extérieur dans le code et de travailler avec elle, vous avez eu accès à la mémoire spécifique qu'il est passé en. Nous avons donc utilisé les pointeurs const pour s'assurer que les fonctions de toujours manipulé les valeurs que sont entrées par le biais de l'interface OLE.
Plusieurs bonnes raisons ont été invoquées comme des réponses à ces questions (memory-mapped appareils et juste un bon vieux défensive de codage), mais je serais prêt à parier que la plupart des cas où vous voyez ce qu'il est en fait une erreur et que l'intention était d'avoir au point être un pointeur-à-const.
Je n'ai certainement pas de données à sauvegarder cette intuition, mais je préfère encore faire le pari.
const
question de l'optimisation? Tout habile compilateur peut déterminer si vous modifiez une variable, et de l'optimiser si l'on peut sur cette base, si oui ou non vous dit vous voulez.Pense type* et const type* que les types eux-mêmes. Ensuite, vous pouvez voir pourquoi vous devriez avoir une const ces types de.
toujours penser à un pointeur de type int. cela signifie que
peut effectivement être considéré comme
donc, un pointeur const signifie simplement que:
devient
et donc u ne pouvez pas modifier l'adresse sur laquelle pointe le pointeur trop, et c'est tout. Pour empêcher la modification des données, u doit faire un pointeur vers un const objet.
int
s, de multiples façons. Aussi, la question est très clairement indiqué comme étant sur leconst
pointeurs, pas des pointeurs versconst
objets. Mais vous les avez à l'envers de toute façon.