Comment stocker une variable C ++ dans un registre
Je voudrais quelques précisions sur un point sur le stockage de registre variables:
Est-il un moyen de s'assurer que, si nous avons déclaré un registre variable dans notre code, qu'il ne peut être stocké dans un registre?
#include<iostream>
using namespace std;
int main()
{
register int i=10;//how can we ensure this will store in register only.
i++;
cout<<i<<endl;
return 0;
}
source d'informationauteur ashutosh kumar
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas. Il n'est qu'une indication pour le compilateur qui suggère que la variable est fortement utilisé. Voici le C99 libellé:
Et voici le C++11 libellé:
En fait, la
register
classe de stockage spécifique est déprécié en C++11 (Annexe D. 2):Notez que vous ne pouvez pas prendre l'adresse d'un
register
variable en C parce que les registres n'ont pas une adresse. Cette restriction est supprimée en C++ et en prenant l'adresse est à peu près garanti pour assurer la variable ne finira pas dans un registre.Beaucoup les compilateurs modernes ignorent tout simplement l'
register
mot-clé en C++ (sauf s'il est utilisé dans un invalide façon, bien sûr). Ils sont tout simplement beaucoup mieux à l'optimisation de ce qu'ils étaient lors de laregister
mot-clé a été utile. Je m'attends à de compilateurs pour des niches de cibler des plates-formes pour traiter plus sérieusement.La
register
mot a une signification différente en C et C++. En C++, il est en fait redondante et semble même être obsolète de nos jours.En C, c'est différent. D'abord, ne prenez pas le nom du mot-clé littéralement, il n'a pas toujours à voir avec un matériel "s'inscrire" sur un PROCESSEUR récent. La restriction imposée sur
register
variables, c'est que vous ne pouvez pas prendre leur adresse, la&
opération n'est pas autorisée. Cela vous permet de marquer une variable pour l'optimisation et de s'assurer que le compilateur va crier à vous si vous essayez de prendre son adresse. En particulier, unregister
variable qui est aussiconst
qualifié ne peut jamais alias, c'est donc un bon candidat pour l'optimisation.À l'aide de
register
comme en C systématiquement vous oblige à penser à chaque endroit où vous prenez l'adresse d'une variable. Ce n'est probablement rien de ce que tu voudrais le faire en C++, qui s'appuie fortement sur des références à des objets et des choses comme ça. Cela pourrait être une raison pourquoi le C++ n'a pas de copie de cette propriété deregister
variables de C.C'est juste une indication pour le compilateur; vous ne pouvez pas force de placer la variable dans un registre. Dans tous les cas, le compilateur écrivain a probablement beaucoup mieux de la connaissance de l'architecture cible que le programmeur d'application, et est donc mieux placé pour écrire un code qui permet d'enregistrer les décisions d'allocation. En d'autres termes, vous êtes peu probable réaliser quoi que ce soit en utilisant
register
.Généralement, c'est impossible. Plus précisément, on peut prendre certaines mesures pour augmenter la probabilité:
Utilisez le bon niveau d'optimisation, par exemple.
-O2
Maintenir le nombre de variables petit
Ne prenez pas une adresse du registre de la variable.
Dans certains compilateurs, vous pouvez suggérer
Le "registre" mot-clé est un vestige de l'époque où les compilateurs ont dû s'adapter sur des machines avec 2 mo de RAM (partagé entre 18 bornes avec un utilisateur connecté sur chaque). Ou PC/ordinateurs de la Maison de 128 256 KO de RAM. À ce stade, le compilateur ne pouvais pas vraiment courir à travers une grande fonction pour déterminer lequel de vous inscrire à l'utilisation de la variable qui, à utiliser les registres de la manière la plus efficace. Donc, si le programmeur a donné une "astuce" avec
register
le compilateur met dans un registre (si possible).Les compilateurs modernes ne correspondent pas à plusieurs reprises, dans les 2 mo de RAM, mais ils sont beaucoup plus intelligent à l'affectation des variables à des registres. Dans l'exemple donné, je trouve ça très unlikley que le compilateur ne le mettrais pas dans un registre. Évidemment, les registres sont en nombre limité, et donné suffisamment complexe morceau de code, certaines variables ne rentre pas dans les registres. Mais pour un exemple simple, moderne compilateur fera
i
un registre, et il ne sera probablement pas toucher la mémoire jusqu'à ce que quelque part à l'intérieur deostream& ostream::operator<<(ostream& os, int x)
.Généralement RPC compilateurs(g++) faire tout à fait quelques optimisations du code. Lorsque vous déclarez un registre de la variable, il n'est pas nécessaire que le compilateur va stocker cette valeur directement dans le registre. (j'.e) le code "register int x' peut ne pas aboutir à compilateur de stockage qui int directement dans le registre. Mais si nous pouvons forcer le compilateur à faire, peut être couronnée de succès.
Par exemple, si nous utilisons le morceau de code suivant, puis nous pouvons forcer le compilateur à faire ce que nous désirons. Compilation de le morceau de code suivant peut l'erreur, ce qui indique que l'int est réellement obtenir directement stockées dans le registre.
Pour moi, le compilateur g++ est en train de jeter l'erreur suivante dans ce cas.
La ligne 'volatile registre int x asm ("eax")' donne ses directives au compilateur que, store le nombre entier x dans 'eax registre et ainsi de ne pas faire des optimisations. Cela permettra de s'assurer que la valeur est stockée dans le registre directement. C'est pourquoi l'accès à l'adresse de la variable est de lancer une erreur.
Sinon, le compilateur C (gcc), peuvent d'erreur avec le code suivant lui-même.
Pour moi, le compilateur gcc est en train de jeter l'erreur suivante dans ce cas.
La seule façon de s'assurer que vous êtes en utilisant un registre, est d'utiliser l'assembly en ligne. Mais, même si vous faites cela, vous ne sont pas garantis que le compilateur ne stockez pas votre valeur à l'extérieur de la ligne du bloc d'assemblage. Et, bien sûr, votre système d'exploitation peut décider d'interrompre votre programme à tout moment, le stockage de tous vos registres de la mémoire, afin de donner le traitement à un autre processus.
Donc, sauf si vous écrivez le code assembleur dans le noyau avec toutes les interruptions désactivées, il n'y a absolument aucun moyen de s'assurer que votre variable n'atteindra jamais la mémoire.
Bien sûr, qui n'est pertinente que si vous êtes préoccupé par la sécurité. À partir d'un point de vue des performances, de la compilation avec
-O3
est généralement suffisante, le compilateur n'est généralement tout à fait un bon travail à déterminer les variables à tenir dans les registres. De toute façon, le stockage des variables dans des registres n'est qu'un petit aspect de l'optimisation des performances, l'aspect plus important est de veiller à ce qu'aucun superflu ou coûteux travail s'effectue dans la boucle interne.Ici, vous pouvez utiliser
volatile register int i = 10
en C++ pour assureri
être stockées dans le registre.volatile
mot-clé ne sera pas permettre au compilateur d'optimiser la variablei
.