22 votes

Pourquoi adresse de l'opérateur ('&') peut être utilisé avec des objets qui sont déclarées avec le registre de stockage spécificateur de classe en C++?

Dans le langage de programmation C, nous ne sommes pas autorisés à utiliser l'adresse de l'opérateur(&) avec des variables qui sont déclarées avec le registre de stockage de classe rédacteur de devis.

Il donne error: address of register variable ‘var_name' requested

Mais si on fait un programme en c++ et effectuer la même tâche (j'.e à utiliser l' & auprès de registre de stockage variable), il ne nous donne aucune erreur.

par exemple.

#include <iostream>
using namespace std;
int main()
{
    register int a;
    int * ptr;
    a = 5;
    ptr = &a;
    cout << ptr << endl;
    return 0;
}

Sortie :-

0x7ffcfed93624

Eh bien, ce doit être une fonction supplémentaire de C++, mais la question est sur la différence entre le registre de stockage de classe en C et C++.

20voto

Alan Stokes Points 9095

La restriction sur la prise de l'adresse a été délibérément supprimée en C++, il n'y avait pas d'intérêt à cela, et il a fait la langue la plus compliquée. (E. g. qu'arriverait-il si vous lié à une référence à un register variable?)

L' register mot-clé n'a pas été beaucoup utilisé depuis de nombreuses années - les compilateurs sont très bonnes à trouver quoi mettre dans les registres par eux-mêmes. En effet, en C++, le mot clé est actuellement obsolète et sera finalement retiré.

8voto

sqykly Points 789

L' register classe de stockage à l'origine, fait allusion au compilateur que la variable de sorte qualifié devait être utilisés de manière fréquente que le maintien de sa valeur dans la mémoire serait une performance inconvénient. La grande majorité des architectures des processeurs (peut-être pas SPARC? Même pas certain qu'il y est un contre-exemple) ne peuvent effectuer aucune opération entre deux variables sans premier chargement de l'une ou des deux à partir de la mémoire dans ses registres. Chargement des variables à partir de la mémoire dans les registres et écrit de nouveau à la mémoire une fois opéré prend beaucoup de fois plus de cycles de PROCESSEUR que les opérations elles-mêmes. Ainsi, si une variable est utilisée fréquemment, on peut obtenir un gain de performance par la mise de côté d'un s'inscrire pour elle et de ne pas s'embêter avec de la mémoire à tous.

Ce faisant, toutefois, a une variété de conditions. Nombreux sont différents pour chaque architecture de PROCESSEUR:

  • Tous les processeurs ont un fixe nombre de registres, mais chaque modèle de processeur a un numéro différent. Dans les années 80, vous pourriez avoir eu 4 raisonnablement susceptibles d'être utilisés pour un register variable.
  • La plupart des fabricants ne prennent pas en charge l'utilisation de tous les registres pour chaque instruction. Dans les années 80, il n'était pas rare d'avoir un seul registre que vous pouvez utiliser pour l'addition et la soustraction, et probablement que vous ne pouvez utiliser que même registre comme un pointeur.
  • Les conventions d'appel dicté différents ensembles de registres qui pourraient être remplacées par des sous-routines c'est à dire les appels de fonction.
  • La taille d'un registre diffère entre les processeurs, il y a donc des cas où l' register variable ne rentre pas dans un registre.

Parce que C est conçu pour être indépendant de la plate-forme, ces restrictions ne pouvaient pas être imposé par la norme. En d'autres termes, s'il peut être impossible de compiler une procédure avec 20 register variables d'un système qui n'a fait que 4 registres de la machine, le programme C ne doit pas être "mauvais", comme il n'y a aucune raison logique d'une machine ne peut pas avoir 20 registres. Ainsi, l' register de stockage de classe a toujours été juste un soupçon que le compilateur a pu ignorer si le spécifique de la plate-forme cible ne serait pas le soutenir.

L'incapacité de faire référence à un registre est différent. Un register est précisément de ne pas tenir à jour dans la mémoire et pas tenus à jour si des modifications sont apportées à la mémoire; c'est le point de l'ensemble de la classe de stockage. Car ils ne sont pas destinés à avoir une garantie de représentation en mémoire, ils ne peuvent pas logiquement avoir une adresse en mémoire qui sera significatif pour le code externe qui peut obtenir le pointeur. Les registres n'ont pas d'adresse de leur propre CPU, et ils n'ont quasiment jamais une adresse accessible à tout le coprocesseur. Par conséquent, toute tentative pour obtenir une référence à un register est toujours une erreur. Le C standard pourraient facilement respecter cette règle.

Que l'informatique a évolué, cependant, certaines tendances développés qui ont affaibli le but de l' register classe de stockage lui-même:

  • Les processeurs sont venus avec un plus grand nombre de registres. Aujourd'hui, vous avez probablement au moins 16 ans, et ils peuvent probablement être utilisés de façon interchangeable pour la plupart des besoins.
  • Processeurs Multi-core et distribué exécution de code est devenu très commun; un seul noyau qui a accès à tout un registre et ils n'ont jamais partager sans impliquant la mémoire de toute façon.
  • Algorithmes pour l'allocation de registres pour les variables est devenu très efficace.

En effet, les compilateurs sont maintenant très bon à l'affectation des variables à des registres qu'ils seront généralement faire un meilleur travail d'optimisation que n'importe quel humain. Ils ont certainement savoir quels sont ceux que vous utilisez le plus fréquemment, sans vous raconter. Il serait plus compliqué pour le compilateur (c'est à dire pas pour le standard ou pour le programmeur) la production de ces optimisations si elles ont tenu à l'honneur de votre manuel register conseils. Il est devenu de plus en plus commun pour les compilateurs pour catégoriquement de les ignorer. Par le C++ existé, il était obsolète. Il est inclus dans la norme pour la compatibilité ascendante, pour garder le C++ aussi près que possible à un sur-ensemble de C. Les exigences d'un compilateur à l'honneur de l'indice et donc les exigences à respecter les conditions dans lesquelles l'indicateur pourrait être honorées été affaibli en conséquence. Aujourd'hui, la classe de stockage de soi est obsolète.

Donc, même si c'est encore le cas aujourd'hui (et le sera jusqu'à ce que les ordinateurs ne même pas avoir registres) que vous ne pouvez pas logiquement avoir une référence à un PROCESSEUR inscrire, l' attente que l' register classe de stockage seront à l'honneur est donc disparu depuis longtemps qu'il est déraisonnable pour le standard pour exiger que les compilateurs de demander que vous soyez logique dans votre utilisation.

1voto

rcgldr Points 1197

Référencé registre le registre lui-même. Si la fonction d'appel adopté ESI comme un référencés paramètre, alors la fonction appelée utiliserait ESI en tant que paramètre. Comme l'a souligné Alan Stokes, la question est de savoir si une autre fonction appelle également la même fonction, mais cette fois avec l'EDI le même référencé paramètre.

Pour ce travail, deux surchargé comme des instances de la fonction appelée devraient être créés, l'un prenant ESI en tant que paramètre, l'un prenant l'EDI en tant que paramètre. Je ne sais pas si une réelle compilateur C++ en fait met en œuvre une optimisation en général, mais c'est la façon dont cela pourrait être fait.

Un exemple de registre par la référence est la façon std::swap() est optimisé (les deux paramètres sont des références), ce qui finit souvent comme inline code. Parfois, pas de swap a lieu: par exemple, std::swap(a, b), pas de swap a lieu, plutôt que le sens de a et b est remplacée dans le code qui suit (les références à ce qui a été une des références devenues à b et vice-versa).

Sinon, une référence paramètre force la variable à être situé en mémoire au lieu d'un registre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X