Je suis confus quant à l'utilisation du register
mot - clé en C. On dit généralement que son utilisation n'est pas nécessaire comme dans cette question sur stackoverflow .
Ce mot-clé est-il totalement redondant en C à cause des compilateurs modernes ou existe-t-il des situations dans lesquelles il peut encore être utile? Si oui, dans quelles situations l'utilisation d'un register
mot-clé est-elle réellement utile?
const
mot-clé mais cette question a prouvé que j'avais tort. Je vais donc attendre et voir ce que j'obtiens.const
mot-clé est quelque chose de différent par rapport au registre.Réponses:
Ce n'est pas redondant en termes de langage, c'est juste qu'en l'utilisant, vous dites au compilateur, vous "préféreriez" avoir une variable stockée dans le registre. Il n'y a cependant absolument aucune garantie que cela se produira réellement pendant l'exécution.
la source
Comme déjà mentionné, les optimiseurs de compilateur rendent essentiellement le
register
mot clé obsolète à des fins autres que la prévention de l'aliasing. Cependant, il existe des bases de code entières qui sont compilées avec l'optimisation désactivée (-O0
en gcc-speak ). Pour un tel code, leregister
mot - clé peut avoir un grand effet. Plus précisément, les variables qui autrement obtiendraient un emplacement sur la pile (c'est-à-dire tous les paramètres de fonction et les variables automatiques) peuvent être placées directement dans un registre si elles sont déclarées avec leregister
mot - clé.Voici un exemple concret: supposez qu'une récupération de base de données s'est produite et que le code de récupération a placé le tuple récupéré dans une structure C. En outre, supposons qu'un certain sous-ensemble de cette structure C doit être copié dans une autre structure - peut-être que cette deuxième structure est un enregistrement de cache qui représente les métadonnées stockées dans la base de données qui, en raison de contraintes de mémoire, ne met en cache qu'un sous-ensemble de chaque enregistrement de métadonnées tel que stocké dans la base de données.
Étant donné une fonction qui prend un pointeur vers chaque type de structure et dont le seul travail consiste à copier certains membres de la structure initiale vers la deuxième structure: les variables du pointeur de structure vivront sur la pile. Comme les affectations se produisent des membres d'une structure à l'autre, les adresses de la structure seront, pour chaque affectation, chargées dans un registre afin d'effectuer l'accès des membres de la structure qui sont copiés. Si les pointeurs de structure devaient être déclarés avec le
register
mot clé, les adresses des structures resteraient dans les registres, supprimant effectivement les instructions de chargement d'adresse dans le registre pour chaque affectation.Encore une fois, n'oubliez pas que la description ci-dessus s'applique au code non optimisé .
la source
Vous dites au compilateur que vous ne prendrez pas l'adresse de la variable et le compilateur peut alors ostensiblement effectuer d'autres optimisations. Pour autant que je sache, les compilateurs modernes sont assez capables de déterminer si une variable peut / doit être conservée dans un registre ou non.
Exemple:
la source
À l'époque des ordinateurs 16 bits, il fallait souvent plusieurs registres pour exécuter des multiplications et des divisions 32 bits. Au fur et à mesure que les unités à virgule flottante étaient incorporées dans les puces et que les architectures 64 bits prenaient le relais, la largeur des registres et leur nombre augmentaient. Cela conduit finalement à une ré-architecture complète du CPU. Voir Enregistrer des fichiers sur Wikipedia.
En bref, cela vous prendrait un peu de temps pour comprendre ce qui se passe réellement si vous êtes sur une puce X86 ou ARM 64 bits. Si vous utilisez un processeur intégré 16 bits, cela pourrait vous apporter quelque chose. Cependant, la plupart des petites puces intégrées ne fonctionnent pas en temps critique - votre four à micro-ondes peut échantillonner votre pavé tactile 10 000 fois par seconde - rien qui ne fatigue un processeur de 4 MHz.
la source
Afin de déterminer si le mot clé register a une signification, de minuscules exemples de codes ne suffiront pas. Voici un code-c qui me suggère, le mot-clé de registre a toujours une signification. Mais cela pourrait être différent avec GCC sur Linux, je ne sais pas. Le registre int k & l sera-t-il stocké dans un registre CPU ou non? Les utilisateurs Linux (en particulier) devraient compiler avec GCC et l'optimisation. Avec Borland bcc32, le mot-clé register semble fonctionner (dans cet exemple), car l'opérateur & donne des codes d'erreur pour les entiers déclarés de registre. REMARQUE! Ce n'est PAS le cas d'un petit exemple avec Borland sous Windows! Pour vraiment voir ce que le compilateur optimise ou non, il doit s'agir d'un exemple plus que minuscule. Les boucles vides ne feront pas l'affaire! Néanmoins - SI une adresse PEUT être lue avec l'opérateur &, la variable n'est pas stockée dans un registre CPU. Mais si une variable déclarée de registre ne peut pas être lue (provoquant un code d'erreur lors de la compilation) - je dois présumer que le mot-clé de registre place réellement la variable dans un registre CPU. Cela peut différer sur différentes plateformes, je ne sais pas. (Si cela fonctionne, le nombre de "ticks" sera beaucoup plus faible avec la déclaration de registre.
la source