Qu’est-ce qu’un bon exemple d’utilisation d’une variable de registre en C?

Je lis K & R et abordai la petite section sur les variables de registre. Je me demandais si les gens ici avaient de bons exemples de cela mis en pratique.

De la section 4.7 dans K & R:

La déclaration du registre ressemble à
register int x;
enregistrer le caractère c;

Pour être clair, j’espère juste voir des exemples de code intéressants. Je suis (à peu près sûr de bien comprendre) le sujet, je ne ressens donc pas le besoin de taper une explication verbeuse (à moins que vous ne le vouliez).

Il n’existe aucun bon exemple d’utilisation du registre lors de l’utilisation de compilateurs modernes (lire: les 15 dernières années), car cela ne sert pratiquement à rien et peut en causer. Lorsque vous utilisez register, vous dites au compilateur “Je sais optimiser mon code mieux que vous”, ce qui n’est presque jamais le cas. Une des trois choses peut se produire lorsque vous utilisez le registre:

  • Le compilateur l’ignore, c’est très probablement. Dans ce cas, le seul inconvénient est que vous ne pouvez pas prendre l’adresse de la variable dans le code.
  • Le compilateur répond à votre demande et, par conséquent, le code est plus lent.
  • Le compilateur répond à votre demande et le code s’exécute plus rapidement, il s’agit du scénario le moins probable.

Même si un compilateur produit un meilleur code lorsque vous utilisez register, il n’y a aucune raison de penser qu’un autre fera de même. Si vous avez du code critique que le compilateur n’optimise pas assez, votre meilleur choix est probablement d’utiliser l’assembleur pour cette partie de toute façon, mais bien sûr, le profilage approprié pour vérifier que le code généré est réellement un problème est d’abord.

En général, je suis d’accord avec Robert , mais comme toute bonne règle, celle-ci comporte également des exceptions.
Si vous travaillez sur un système profondément intégré, vous savez peut-être mieux que compilateur comment optimiser le code pour votre application spécifique sur votre architecture matérielle spécifique .

Mais dans 99% des cas, l’explication de Roberts convient également pour les mots incorporés.

Je sais que cela remonte à un certain temps, mais voici une implémentation d’une sous-procédure de type heapsort dans laquelle l’utilisation de variables de registre accélère l’algorithme, au moins en utilisant gcc 4.5.2 pour comstackr le code.

 inline void max_heapify(int *H, int i){ char OK = FALSE; register int l, r, max, hI; while(!OK){ OK = TRUE; l = left(i); r = right(i); max = i; if(l < = H[SIZE] && H[l] > H[i]){ max = l; } if(r < = H[SIZE] && H[r] > H[max]){ max = r; } if(max != i){ OK = FALSE; hI = H[i]; H[i] = H[max]; H[max] = hI; i = max; } } } 

J’ai testé l’algortihm avec et sans le mot clé register avant les atsortingbuts et je l’ai exécuté pour sortinger un tableau aléatoire contenant 50 000 000 éléments sur mon bloc-notes, plusieurs fois pour chaque version.

l’utilisation de registres a permis de faire passer le temps des tas de données d’environ 135 à environ 125.

J’ai également testé avec 5 000 000 d’éléments seulement, mais je l’ai exécuté plusieurs fois.

La version sans registre a commencé à 11 secondes, mais chaque exécution a réduit le temps jusqu’à atteindre 9,65 secondes et s’est arrêtée.

la version avec le registre a commencé à 10 secondes et a baissé le temps jusqu’à 8,80 secondes.

Je pense que cela a quelque chose à voir avec la mémoire cache. Néanmoins, il semble que les registres rendent l’algorithme plus rapide d’un facteur de constance.

Étant donné que ces variables sont très utilisées le long de l’algorithme, s’assurer qu’elles sont bien enregistrées au lieu de laisser ce travail au compilateur a permis d’obtenir un meilleur résultat dans ce cas. Cependant, cela n’a pas beaucoup amélioré le temps.

J’espère que cela sera utile à quelqu’un, salutations.

Un autre cas courant concerne la mise en œuvre d’interprètes de bas niveau. Garder un état dans les registres, par exemple. pointeur de stack de machine virtuelle, peut réduire considérablement l’access à la mémoire et accélérer votre code.

Voir vmgen – un générateur d’interprètes de machine virtuelle efficaces pour un exemple d’optimisation (Mise en cache supérieure à la stack 5.2).

La première est que la variable de registre devrait être utilisée pour les variables très utilisées telles que la variable de contrôle de boucle afin d’améliorer les performances en minimisant le temps d’access. secondaire, vous pouvez uniquement utiliser et enregistrer que le spécificateur de stockage dans cette situation, par exemple, fun (auto int a, auto int b): erreur fun (register int a, register int b): à droite uniquement, cette option serait exécutée avec amusement (static int a, static int b): erreur fun (extern int a, extern int b): erreur

Eh bien, c’est une question qui a besoin de plusieurs réponses car il existe plusieurs contextes de codage: du sharepoint vue du langage de haut niveau, du niveau moyen au niveau bas (jusqu’à l’assemblage) puisque le langage C peut appeler des routines d’assemblage.

La raison d’utiliser assembleur au lieu de C est probablement due aux problèmes de performances rencontrés lors du développement soz oui, le mot clé register est nécessaire, mais non, il ne fonctionne pas comme prévu par le développeur dans de nombreux cas.