quand utiliser les registres en C?

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 n’a pas d’importance. Le code s’exécute rapidement tel qu’il est actuellement, plus lentement si le mot clé register est supprimé. Cependant, lorsque j’ajoute dans register avant int n, il est en fait plus lent que maintenant, mais plus rapide que si aucun registre n’est utilisé.

Quelqu’un peut m’expliquer cela? Merci.

register donne au compilateur un indice pour placer la variable dans un registre à la place de l’espace mémoire / stack. Dans certains cas, il n’y aura pas assez de registres pour chaque variable sur laquelle vous placerez ce mot-clé. Par conséquent, si vous le placez sur un trop grand nombre de variables, certaines des autres seront forcées à quitter le registre.

Ceci n’est cependant qu’un indice et le compilateur n’a pas à le prendre.

Comment avez-vous chronométré ça? En pratique, l’ register ne fait généralement rien. C’est un peu cruellement à l’époque où la technologie du compilateur était extrêmement primitive et que les compilateurs ne pouvaient pas déterminer eux-mêmes l’allocation des registres. Il était supposé être un indice pour l’affectation d’un registre à cette variable et était utile pour les variables utilisées très fréquemment. De nos jours, la plupart des compilateurs l’ignorent simplement et allouent des registres selon leurs propres algorithmes.

Dans gcc, register n’est définitivement pas ignoré, sauf si vous spécifiez des options d’optimisation. Tester votre code avec quelque chose comme ça

 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)

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

À gauche, le résultat de l'utilisation de registres.

Il y a un nombre limité de registres disponibles, donc marquer tout comme registre ne mettra pas tout dans les registres. L’parsing comparative est le seul moyen de savoir si cela va aider ou non. Un bon compilateur devrait être en mesure de déterminer quelles variables doivent être insérées dans des registres. Vous devriez donc probablement en évaluer davantage avant de décider que les mots-clés de registre aident.

L’idée d’utiliser register est que votre variable est utilisée très souvent. S’il y a une opération avec votre variable, celle-ci sera quand même copiée dans un registre. Donc, compteur (variables d’index) sont candidats à ce modificateur. Dans l’exemple de Diego Torres Milano du 15 janvier 2010 à 1:57, je dirais ceci:

 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 atsortingbuables. Si vous le perdez, vous vous retrouvez avec un code moins efficace.

À mon avis, si ce que vous faites est si important que vous deviez décider vous-même de ce qui est inscrit dans un registre et de ce qui ne fonctionne pas, vous devriez l’écrire en utilisant le langage assembleur.

Pour les langages à usage général, je crois fermement qu’un compilateur est mieux en mesure de décider de ce qui est contenu dans un registre qu’un humain. La preuve en est que, bien que vous ne sachiez pas combien de variables vous pouvez mettre dans des registres, votre compilateur en est certain.