La plupart des compilateurs prennent en charge un indicateur tel que -S
ou /S
qui génère une sortie en langage assembleur. Vous pouvez inspecter ce code pour voir si votre compilateur stocke une variable donnée dans un registre à un point donné.
Aucun type n'est garanti pour tenir dans un registre. En fait, certaines machines basées sur des piles, y compris l'implémentation matérielle de JVM dans le manuel d'Andrew Tannenbaum, n'ont aucun registre explicite. Cependant, un int
est généralement de la même taille qu'un registre (les environnements 64 bits qui définissent int
et long
comme 32 bits pour la compatibilité descendante sont des exceptions), un pointeur contient généralement une adresse de machine et a donc généralement la même taille qu'un registre (les modèles de mémoire segmentés tels que x86 16 bits, où les adresses correspondent à deux registres sont des exceptions), et size_t
et ptrdiff_t
contiennent des indices de tableau et ont donc généralement la même taille qu'un registre (la cible x32, qui a un code de 64 bits). mais un espace mémoire de 32 bits est une exception). La plupart des processeurs ont des registres à virgule flottante qui peuvent chacun contenir un double
pour faire des calculs, mais d'autres non. Si vous voulez un code portable rapide, il est préférable d'utiliser les types int_fast16_t
et uint_fast32_t
de <stdint.h>
. Ceux-ci sont garantis pour être la taille généralement la plus rapide qui est au moins assez large. et sur des cibles normales, cela va être la taille d'un registre de machine.
'register' peut être ignoré par le compilateur et sera par de nombreux compilateurs modernes pour allouer des registres. Aujourd'hui, seul l'effet secondaire de ne pas être autorisé à prendre son adresse est le seul cas d'utilisation pertinent. Pour le reste: votre question est trop large. Lisez comment fonctionnent les processeurs, le manuel de référence de votre CPU ** spécifique ** et l'ABI de votre plateforme. – Olaf