“registre” mot-clé dans C?
Ce qui ne l' register
mot-clé le faire en langage C? J'ai lu qu'il est utilisé pour l'optimisation, mais n'est pas clairement définies dans la norme. Est-il encore d'actualité et si oui, quand vous l'utiliser?
- Quel est le registre de mots clés faire en C? est ignorée 🙂
- Pas complètement ignoré. Essayez d'obtenir une adresse de
register
variable. - Ce code vous êtes en train de lire est vieux youtube.com/watch?v=ibF36Yyeehw#t=1827
Vous devez vous connecter pour publier un commentaire.
C'est une allusion au compilateur que la variable sera fortement utilisé et que vous recommander de le maintenir dans un processeur de vous inscrire, si possible.
Plus les compilateurs modernes le font automatiquement, et sont mieux à même de la cueillette que nous, les humains.
register
variable d'être pris; c'est le que effet obligatoire de laregister
mot-clé. Même cela est suffisant pour améliorer les optimisations, car il devient trivial de dire que la variable ne peut être modifiée qu'à l'intérieur de cette fonction.Je suis surpris que personne n'a mentionné que vous ne pouvez pas prendre une adresse de registre variable, même si le compilateur décide de garder variable en mémoire plutôt que dans le registre.
Donc à l'aide d'
register
vous gagnez rien (de toute façon le compilateur va décider pour lui-même, où mettre la variable) et de perdre la&
opérateur - pas de raison de l'utiliser.register
est utile pour cela, même si le compilateur ne la mets pas dans un registre.const
est aussi inutile puisqu'il gagne rien à vous, vous avez seulement perdu la capacité de changement d'une variable.register
pourrait être utilisé pour s'assurer que personne ne prend l'adresse d'une variable dans l'avenir, sans réfléchir. Je n'ai jamais eu de raison d'utiliserregister
bien.Il indique au compilateur d'essayer d'utiliser un PROCESSEUR inscrire, au lieu de RAM, pour stocker la variable. Les registres de la CPU et beaucoup plus rapide pour accéder à la RAM. Mais c'est seulement une suggestion pour le compilateur, et il ne peut pas suivre à travers.
Je sais que cette question est sur le C, mais la même question pour le C++ a été fermé comme une copie exacte de cette question. Cette réponse, par conséquent, peuvent ne pas s'appliquer pour C.
Le dernier projet de C++11, N3485, dit dans 7.1.1/3:
En C++ (mais pas en C), la norme ne signifie pas que vous ne pouvez pas prendre l'adresse d'une variable déclarée
register
; cependant, parce qu'une variable stockée dans un PROCESSEUR inscrire tout au long de sa durée de vie n'est pas un emplacement de la mémoire associée avec elle, en essayant de prendre son adresse serait invalide, et le compilateur ignore laregister
mot-clé pour permettre la prise de l'adresse.Il n'a pas été pertinente pour au moins 15 ans que les optimiseurs de prendre de meilleures décisions au sujet de ce que vous pouvez. Même lorsque c'était pertinent, il fait beaucoup plus de sens sur un PROCESSEUR d'architecture avec beaucoup de registres, comme SPARC ou M68000 qu'il y a sur Intel avec son manque de registres, dont la plupart sont réservés par le compilateur pour ses propres fins.
En fait, le registre indique au compilateur que la variable n'a pas d'alias avec
rien d'autre au programme (même pas de char).
Qui peuvent être exploitées par les compilateurs modernes dans une variété de situations, et peut aider le compilateur un peu dans le complexe de code en code simple les compilateurs peuvent trouver cela sur leur propre.
Sinon, il ne sert à rien et n'est pas utilisé pour l'allocation de registres. Il n'est généralement pas subir une dégradation des performances de préciser, aussi longtemps que votre compilateur est assez moderne.
register
interdit de prendre l'adresse à tous, car, autrement, il pourrait être utile de laisser les compilateurs connais des cas où un compilateur serait en mesure d'appliquer registre des optimisations malgré une variable adresse de l'être transmis à une fonction externe (la variable devra être rincée à mémoire pour l'appel, mais une fois que les retours de fonction, le compilateur peut encore la considérer comme une variable dont l'adresse n'avait jamais été pris).bar
est unregister
variable, d'un compilateur peut à loisir remplacerfoo(&bar);
avecint temp=bar; foo(&temp); bar=temp;
, mais en prenant l'adresse debar
serait interdite dans la plupart des autres contextes pourrait ne pas sembler trop compliqué règle. Si la variable, autrement, pourraient être consignés dans un registre, la substitution de rendre le code plus petit. Si la variable devra être conservé dans la mémoire RAM de toute façon, la substitution de rendre le code plus. Laissant la question de savoir si de faire de la substitution jusqu'à le compilateur pourrait conduire à un code de meilleure qualité dans les deux cas.register
de qualification sur des variables globales, que ce soit ou non le compilateur permet de l'adresse de prises, permettrait à certains de nice optimisations dans les cas où une fonction inline que l'utilisation d'une variable globale est appelée à plusieurs reprises dans une boucle. Je ne peux pas penser à une autre façon de faire que la variable consignés dans un registre entre les itérations de boucle--pouvez-vous?En fait, il est clairement définis par la norme. Citant le N1570 projet section 6.7.1 paragraphe 6 (les autres versions ont le même libellé):
Unaire
&
opérateur ne peut pas être appliquée à un objet défini avecregister
, etregister
ne peut pas être utilisé dans une déclaration externe.Il y a quelques autres (assez obscure) les règles qui sont spécifiques à
register
qualifiés d'objets:la Définition d'un tableau d'objets avecregister
a un comportement indéfini.Correction: Il est légal de définir un objet de tableau avec
register
, mais vous ne pouvez pas faire quelque chose d'utile avec un tel objet (l'indexation dans un tableau nécessite de prendre l'adresse de son premier élément)._Alignas
spécificateur (nouveau en C11) ne peut pas être appliquée à un tel objet.va_start
macro estregister
-qualifié, le comportement est indéfini.Il peut y avoir quelques autres; télécharger un projet de la norme et de la recherche pour "enregistrer" si vous êtes intéressé.
Comme son nom l'indique, le original sens de
register
, à exiger un objet à être stockées dans un PROCESSEUR inscrire. Mais avec des améliorations dans l'optimisation des compilateurs, c'est devenu moins utile. Les versions modernes de la norme ne se réfèrent pas à des registres du CPU, car ils n'ont plus (au besoin) supposons qu'il existe une telle chose (il y a des architectures de ne pas utiliser les registres). La sagesse commune est que l'application deregister
à un objet de la déclaration est plus susceptible de aggraver le code généré, car elle interfère avec le compilateur propres de l'allocation de registres. Il y a encore quelques cas où c'est utile (par exemple, si vous avez vraiment de savoir combien de fois une variable soit accessible, et de vos connaissances est mieux que ce que modernes d'un compilateur optimisant peut comprendre).Le principal effet tangible de
register
est qu'il empêche toute tentative de prendre l'adresse d'un objet. Ce n'est pas particulièrement utile comme un indicateur d'optimisation, car elle peut être appliquée que pour les variables locales, et un compilateur optimisant pouvez le voir pour lui-même que telle l'adresse d'un objet n'est pas prise.register
qualifiés objet de tableau, si c'est ce que vous pensez.register
tableau d'objets; voir la mise à jour du premier point de ma réponse. Il est légal de définir un tel objet, mais vous ne pouvez pas faire quelque chose avec elle. Si vous ajoutezregister
à la définition des
dans votre exemple, le programme est illégal (une violation de contrainte) en C. le C++ ne prend pas en place les mêmes restrictions surregister
, de sorte que le programme soit valable en C++ (mais l'utilisation deregister
serait inutile).register
clé peut servir à des fins utiles, s'il était légal de prendre l'adresse de cette variable, mais seulement dans les cas où la sémantique ne serait pas affecté par la copie de la variable temporaire lorsque son adresse est pris, et de le recharger à partir de la temporaire lors de la prochaine séquence de point. Qui permettrait aux compilateurs de supposer que la variable peut être gardé dans un registre dans tous les pointeur accède à condition qu'elle soit vidée à tous les endroits son adresse est pris.Histoire!
C, est comme une langue, est une abstraction d'un ordinateur. Il vous permet de faire des choses, en termes de ce qu'est un ordinateur, c'est de manipuler la mémoire, faire des maths, imprimer des choses, etc.
Mais C est seulement une abstraction. Et en fin de compte, ce qu'il est extraction de vous est langage d'Assemblage. L'assemblée est la langue que le PROCESSEUR lit, et si vous l'utilisez, vous faites les choses dans les termes de la CPU. Ce n'est d'un PROCESSEUR à faire? Fondamentalement, il lit à partir de la mémoire, ne les mathématiques, et les écritures dans la mémoire. Le CPU n'est pas seulement faire des maths sur les nombres dans la mémoire. Tout d'abord, vous devez déplacer un numéro de la mémoire à la mémoire à l'intérieur de la CPU appelle un registre. Une fois que vous avez fini de faire tout ce que vous devez faire à ce numéro, vous pouvez le déplacer à un retour à la normale de la mémoire système. Pourquoi utiliser de la mémoire système à tous? Les registres sont en nombre limité. Vous obtenez seulement une centaine d'octets dans les processeurs modernes, et plus populaire processeurs étaient encore plus incroyablement limitée (Le 6502 a 3 registres de 8 bits pour votre usage libre). Ainsi, la moyenne de votre opération mathématique ressemble:
Beaucoup de qui est... pas de mathématiques. Ceux charger et stocker des opérations peuvent prendre jusqu'à la moitié de votre temps de traitement. C, étant une abstraction d'ordinateurs, libéré le programmeur à vous soucier de l'aide et de jongler avec les registres, et depuis le nombre et le type varient entre ordinateurs, C des lieux de la responsabilité de l'allocation de registres uniquement sur le compilateur. À une exception près.
Lorsque vous déclarez une variable
register
, en vous disant que le compilateur "Yo, j'ai l'intention de cette variable à être beaucoup utilisé et/ou être de courte durée. Si j'étais vous, je voudrais essayer de le garder dans un registre." Lorsque le C standard dit compilateurs n'avez pas à faire quoi que ce soit, c'est parce que le C standard ne veut pas savoir ce que l'ordinateur que vous êtes à la compilation, et qu'il pourrait être comme le 6502 ci-dessus, où tous les 3 registres sont nécessaires seulement pour fonctionner, et il n'y a pas de rechange registre pour conserver votre numéro. Cependant, quand il est dit que vous ne pouvez pas prendre l'adresse, c'est parce que les registres n'ont pas d'adresses. Ils sont le processeur mains. Car le compilateur n'a pas à vous donner une adresse, et depuis il ne peut pas avoir une adresse à tout jamais, plusieurs optimisations sont maintenant ouvertes pour le compilateur. Il pourrait dire, garder un nombre dans un registre toujours. Il n'a pas à s'inquiéter de savoir où il est stocké dans la mémoire de l'ordinateur (au-delà d'avoir à obtenir en arrière de nouveau). Il pourrait même jeu de mots dans une autre variable, le donner à un autre processeur, de lui donner un changement d'emplacement, etc.tl;dr: Courte durée de vie des variables qui font beaucoup de maths. Ne déclarez pas trop à la fois.
Vous êtes de jouer avec le compilateur sophistiqué graphique-coloration de l'algorithme. Ce est utilisé pour l'allocation de registres. Eh bien, la plupart du temps. Il agit comme indication pour le compilateur -- c'est vrai. Mais pas ignoré dans son intégralité puisque vous n'êtes pas autorisé à prendre l'adresse d'un registre variable (rappelez-vous le compilateur, maintenant sur votre miséricorde, nous essayons d'agir différemment). Qui vous dit de ne pas l'utiliser.
Le mot-clé a été utilisé longtemps, longtemps en arrière. Quand il n'y avait que si peu de registres qui pourrait les compter tous à l'aide de votre index.
Mais, comme je l'ai dit, obsolète ne signifie pas que vous ne pouvez pas l'utiliser.
Juste une petite démo (sans le monde réel but) pour comparaison: lors de la suppression de la
register
mots-clés avant chaque variable, ce morceau de code prend en 3.41 secondes sur mon i7 (GCC), avecregister
le même code se termine en 0,7 seconde.J'ai testé le mot-clé de registre sous QNX 6.5.0 en utilisant le code suivant:
J'ai obtenu les résultats suivants:
-> 807679611 cycles écoulés
-> Ce système a 3300830000 cycles par seconde
-> Les cycles en quelques secondes et est ~0.244600
Et maintenant sans vous inscrire int:
J'ai eu:
-> 1421694077 cycles écoulés
-> Ce système a 3300830000 cycles par seconde
-> Les cycles en quelques secondes et est ~0.430700
Registre informer le compilateur que le codeur cru que cette variable serait écrit/lu assez pour justifier son stockage dans l'un des rares registres disponibles pour utilisation variable. Lecture/écriture à partir des registres est généralement plus rapide, et peut nécessiter une petite op-code jeu.
Aujourd'hui, ce n'est pas très utile, car la plupart des compilateurs' optimiseurs sont mieux que vous à déterminer si un registre doit être utilisé pour cette variable, et pour combien de temps.
Pendant les années soixante-dix, au tout début du langage C, le mot-clé de registre a été introduite afin de permettre au programmeur de donner des conseils pour le compilateur, lui disant que la variable serait très souvent utilisé, et qu'il doit être sage de garder une valeur dans l'une des interne du processeur de registre.
De nos jours, les optimiseurs sont beaucoup plus efficaces que les programmeurs afin de déterminer les variables qui sont les plus susceptibles d'être conservés dans des registres, et l'optimiseur ne prennent pas toujours le programmeur de l'indice en compte.
Beaucoup de gens à tort recommandons de ne pas utiliser le mot clé register.
Nous allons voir pourquoi!
Le registre mot-clé est associé à un effet de bord: vous ne pouvez pas référence (obtenir l'adresse d'un registre de type variable.
Peuple en conseillant aux autres de ne pas utiliser les registres prend à tort cela comme un argument supplémentaire.
Cependant, le simple fait de savoir que vous ne pouvez pas prendre l'adresse d'un registre variable, permet au compilateur (et ses optimizer) à savoir que la valeur de cette variable ne peut pas être modifié par l'intermédiaire d'un pointeur.
Quand à un certain moment de l'instruction stream, un registre de la variable a sa valeur affectée dans un registre du processeur, ainsi que le registre n'a pas été utilisé depuis pour obtenir la valeur d'une autre variable, le compilateur sait qu'il n'a pas besoin de re-charger la valeur de la variable dans ce registre.
Cela permet d'éviter de coûteux inutile d'accès à la mémoire.
Faire vos propres tests et vous obtiendrez des améliorations de performances significatives dans votre plus à l'intérieur des boucles.
c_register_side_effect_performance_boost
Sur prise en charge des compilateurs C, il essaie d'optimiser le code, de sorte que la valeur de la variable est tenue dans un processeur registre.
De Microsoft Visual C++ compilateur ignore la
register
mot clé lors de registre mondial-attribution d'optimisation (le /Oe compilateur drapeau) est activé.Voir mot-Clé de registre sur MSDN.
S'inscrire mot-clé indique compilateur pour stocker la variable particulière dans les registres du CPU de sorte qu'il pourrait être accessible rapidement. À partir d'un programmeur point de vue d'inscrire le mot clé est utilisé pour les variables qui sont fortement utilisés dans le programme, de sorte que le compilateur peut speedup le code. Bien que cela dépend du compilateur de savoir si à maintenir la variable dans les registres du CPU ou de la mémoire principale.
Registre indique au compilateur d'optimiser ce code par le stockage de cette variable dans les registres alors en mémoire. c'est une demande au compilateur de compilateur peut ou ne peut pas considérer cette demande.
Vous pouvez utiliser cette fonction dans le cas où certains de vos variables sont d'un accès très fréquemment.
Ex: Une boucle.
Une chose, c'est que si vous déclarez une variable de registre, vous ne pouvez pas obtenir son adresse comme il n'est pas stocké dans la mémoire. il obtient son allocation du PROCESSEUR registre.