Je trouve des difficultés à comprendre les facteurs sur lesquels dépend la taille des variables de pointeur en C
J’ai vérifié quelques références, la seule information que j’ai obtenue jusqu’à présent est la taille du pointer
dépend de l’ architecture du processeur. J’aimerais connaître les détails suivants
x bits
nombre d’emplacements d’adresse doit être compris entre 0 to 2^(X)-1
. Je perds le fil tout en mesurant le nombre d’emplacements d’adresses et la quantité réelle de mémoire disponible pour le programme. Un pointeur est une variable qui contient l’adresse d’un autre emplacement de mémoire.
Maintenant, si vous utilisez une architecture 32 bits, les registres de la CPU qui contiennent des références de mémoire (et très probablement tous les autres registres également) auront une longueur de 32 bits; c’est essentiellement ce que l’on entend par 32 bits (les registres ont une longueur de mot de 32 bits) et par conséquent un pointeur (qui est un emplacement de mémoire) aurait généralement une longueur de 32 bits (4 octets).
Il en va de même pour les CPU 64 bits. Par conséquent, les pointeurs d’un programme C compilé pour des CPU 64 bits auront généralement une longueur de 8 octets (64 bits).
MODIFIER:
Notez également que dans la plupart des architectures modernes, votre code ne traite pas vraiment de la mémoire physique. vous exécutez et adressez ce que vous appelez une mémoire virtuelle.
Le concept de base est que la combinaison processeur / système d’exploitation indique à votre programme que vous disposez de tout l’espace d’adressage.
Encore une fois, la longueur de l’espace adresse (l’espace que vous pouvez adresser en mémoire) dépendra de la distance à laquelle le processeur peut adresser des emplacements et cela (dans le cas général) dépend de la taille de son mot.
La taille du pointeur dépend de nombreux facteurs (matériel, système d’exploitation, compilateur, etc.), et tous les types de pointeurs de la même plate-forme n’ont pas nécessairement la même taille. Par exemple, certains processeurs intégrés utilisent une architecture Harvard, où code et données se trouvent dans des zones de mémoire distinctes, chacun pouvant avoir une taille de bus différente (par exemple, 8 bits pour les données et 16 bits pour le code). Cela signifie que les pointeurs d’object ( int *
, char *
, double *
) peuvent avoir une largeur de 8 bits, mais que les pointeurs de fonction ( int (*)()
) peuvent avoir une largeur de 16 bits.
Pour un autre exemple, considérons une architecture adressée à un mot , où l’unité de base de la mémoire n’est pas un octet de 8 bits, mais une unité plus grande (où la largeur peut être de 16, 18, 24, 32, 36, 64 ou 128 bits). , ou une autre valeur; les puissances de 2 se sont révélées pratiques, mais pas nécessaires). Certaines de ces architectures peuvent choisir de regrouper plusieurs valeurs de caractère dans un seul mot, ce qui signifie qu’un caractère char *
nécessite quelques bits supplémentaires pour spécifier un décalage dans le mot.
Dans le livre C: Un manuel de référence , Harbison & Steele décrivent une architecture avec des mots de 36 bits. Les données de caractères ont été stockées sous forme de valeurs ASCII 7 bits, ce qui signifie que chaque mot peut contenir 5 caractères avec un bit inutilisé. tous les autres types prenaient des mots entiers.
Je trouve des difficultés à comprendre les facteurs sur lesquels dépend la taille des variables de pointeur en C. J’ai vérifié quelques références, la seule information que j’ai obtenue jusqu’à présent est la taille du pointeur dépend de l’architecture du processeur. C’est 4 octets sur une machine 32 bits et 8 octets sur une machine 64 bits. J’aimerais connaître les détails suivants
Ce n’est pas forcément le cas, de toute façon il faut comprendre que la taille d’un pointeur contient l’adresse d’une adresse virtuelle (sur le système d’exploitation qui la supporte). Par conséquent, la taille du pointeur dépend de la largeur du bus de mémoire. C’est pourquoi l’architecture influe sur la taille des pointeurs. Notez que ce n’est pas vrai tout le temps: tous les pointeurs peuvent ne pas avoir la même taille, par exemple.