324
Le logiciel R - Maˆ ıtriser le langage
7.8.2.2 Allocation cons´ ecutive de la m´ emoire
Il faut en fait savoir que la plus petite portion de m´ emoire virtuelle qui
peut ˆ etre allou´ ee (r´ eserv´ ee) par R est de 8 octets (= 64 bits). La m´ emoire
est donc allou´ ee dans R par paquets de 8 octets cons´ ecutifs (que ce soit sur
les processeurs 32 ou 64 bits). Ainsi, dans l’instruction x <- 3L, c’est en fait
64 cases (d’1 bit) qui sont r´ eserv´ ees, desquelles seules les 32 premi` eres sont
utilis´ ees pour stocker la valeur enti` ere +3. Les 64 cases seraient par exemple
toutes utilis´ ees pour allouer un double par l’instruction :
> x <- 3.0
Remarque
Les 64 cases sont r´ eparties en 1 case pour le signe, 11 cases pour l’exposant et 52 cases pour la mantisse, dans la r´ epr´ esentation du nombre en
virgule flottante (voir la section 3.9.2).
Nous avons int´ egr´ e au package associ´ e `
a ce livre deux fonctions getaddr() et
writeaddr() permettant respectivement de r´ ecup´ erer l’adresse m´ emoire d’une
variable contenant un nombre, et d’´ ecrire une valeur ` a une adresse m´ emoire.
Notez que sur un syst` eme d’exploitation 64 bits, une adresse m´ emoire peut
tr` es bien ˆ etre stock´ ee sur 64 bits. Et puisque les entiers dans R ne sont stock´ es
que sur 32 bits, r´ ecup´ erer cette adresse sous la forme d’un (seul) entier dans R
pourrait poser probl` eme.
> x <- c(8L,9L)
> x
[1] 8 9
> addr <- getaddr(x) # Récupère l’adresse de la première case du
# bloc de 64 cases où est stockée x.
> addr

> addr$zero
# Adresse exprimée en valeur entière,
# stockée sur deux entiers.
[1] 100469376
0
> writeaddr(addr,6L) # Écrit l’entier 6 à cette adresse.
> x
[1] 6 9
> writeaddr(addr+4L,7L) # Un entier est codé sur 4 octets, donc
# on incrémente l’adresse de 4 pour
# passer à x[2].
> x
[1] 6 7
Voyons ce qu’il se passe avec un vecteur de doubles.
> x <- c(12.8,4.5)
> x
Précédent

- 357/701

Suivant