Question

J'ai quelque chose comme ça

register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}

ce qu'il fait, il n'a pas d'importance. Le code fonctionne rapidement la façon dont il est maintenant, plus lent si le mot clé de registre est supprimé. Cependant, quand j'ajouter au registre avant int n, il fonctionne en fait plus lent que maintenant, mais plus rapidement que si aucun registre est utilisé.

Quelqu'un peut-il me l'expliquer? Merci.

Était-ce utile?

La solution

register donne le compilateur un indice de placer la variable dans un registre à la place de l'espace mémoire / pile. Dans certains cas, il n'y aura pas suffisamment de registres pour chaque variable que vous placez ce mot-clé sur afin de le placer sur trop de variables peuvent forcer quelques-unes des autres sur des registres à nouveau.

Ceci est juste un indice, cependant, et le compilateur ne doit pas le prendre.

Autres conseils

Comment avez-vous le temps cela? Dans la pratique, register fait habituellement rien. Il est un morceau de cochonneries de la technologie lorsque du compilateur a été extrêmement primitive et compilateurs ne pouvait pas comprendre eux-mêmes l'allocation de registre. Il était censé être un soupçon d'attribuer un registre à cette variable et a été utile pour les variables utilisées très fréquemment. De nos jours, la plupart des compilateurs ignorent tout simplement et allouer des registres en fonction de leurs propres algorithmes.

Dans gcc, registre est certainement pas ignoré, sauf si vous spécifiez les options d'optimisation. Tester votre code avec quelque chose comme ceci

unsigned int array[10];

int n;

#define REG register

int main()
{
    REG unsigned int a, b, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

vous obtenez (selon que REG est défini ou vide)

http://picasaweb.google.com/lh/photo/v2hBpl6D- soIdBXUOmAeMw? = DirectLink feat

Sur la gauche s'affiche le résultat de l'utilisation de registres.

Il y a un nombre limité de registres disponibles, donc tout marquage que le registre ne sera pas tout mettre dans les registres. L'analyse comparative est le seul moyen de savoir si elle va aider ou non. Un bon compilateur devrait être en mesure de comprendre quelles sont les variables à mettre dans des registres lui-même, de sorte que vous devriez probablement référence un peu plus avant de vous décider que les mots-clés de registre aide.

L'idée d'utiliser le registre est, votre variable est utilisée très souvent. En cas de fonctionnement avec votre variable, il sera copié dans un registre de toute façon. Donc compteur (variables d'index) sont candidats pour ce modificateur. Dans l'exemple de Diego Torres Milano de 15 '10 Jan à 01:57 je faire de cette façon:

unsigned int array[10];    

int main()
{
    register int n;
    unsigned int a = 1, b = 2, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

Il y a une limite aux registres affectables. Si vous AppSort, vous finissez juste avec un code moins efficace.

Mon point de vue est que si ce que vous faites est si important que vous devez vous décider ce qui se passe dans un registre et ce qui ne fonctionne pas, vous devriez l'écrire en utilisant le langage assembleur.

Pour les langues à usage général, je crois fermement qu'un compilateur est mieux en mesure de décider ce qui se passe dans un registre qu'un humain. La preuve étant que si vous n'êtes pas sûr de combien de variables que vous pouvez mettre dans les registres, votre compilateur sait pour sûr.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top