2016-12-30 2 views
-3

J'ai lu que les registres de la CPU sont limités et que la valeur peut également être stockée en auto. Comment confirmer si la variable est stockée dans un registre en C?Enregistrement des variables dans les registres de la CPU

Quels types de variables peuvent être stockés?

+3

'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

Répondre

2

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.