Rainer ha già menzionato che varie tecniche di gestione della memoria aiutano la località. Mi piacerebbe presentare due esperimenti, usando SBCL, che illustrano il suo punto.
Prima di tutto, un'utilità rapida per stampare gli indirizzi di ogni svantaggio in un elenco.
(defun print-addresses (list)
(mapl (lambda (cons)
(format t "address: 0x~X~%"
(sb-kernel:get-lisp-obj-address cons)))
list))
Nel primo esperimento, possiamo vedere che l'allocazione è contiguo, in modo che possiamo creare una lista con dieci elementi e frugando nei loro indirizzi prime ci mostra che sono vicini tra loro:
> (print-addresses (loop repeat 10 collect 'dummy))
address: 0x1003F57167
address: 0x1003F57177
address: 0x1003F57187
address: 0x1003F57197
address: 0x1003F571A7
address: 0x1003F571B7
address: 0x1003F571C7
address: 0x1003F571D7
address: 0x1003F571E7
address: 0x1003F571F7
Secondo esperimento. Cosa succede se facciamo qualche allocazione non correlata in mezzo? Assegniamo una lista di questo tipo a una variabile in modo da poterla usare in seguito.
(defparameter *another-list*
(loop repeat 10
;; using eval to trick the compiler into
;; compiling this piece of dummy code
do (eval '(make-array (random 1000)))
collect 'dummy))
Possiamo vedere che gli indirizzi sono più casuali questa volta:
> (print-addresses *another-list*)
address: 0x10046E9AF7
address: 0x10046EB367
address: 0x10046ECB97
address: 0x10046EE827
address: 0x10046EF247
address: 0x10046F1F17
address: 0x10046F2007
address: 0x10046F3FD7
address: 0x10046F5E67
address: 0x10046F6887
Ora, se si invoca il GC con (sb-ext:gc)
, possiamo vedere che ha confezionato le conses insieme:
> (sb-ext:gc)
> (print-addresses *another-list*)
address: 0x1004738007
address: 0x1004738017
address: 0x1004738027
address: 0x1004738037
address: 0x1004738047
address: 0x1004738057
address: 0x1004738067
address: 0x1004738077
address: 0x1004738087
address: 0x1004738097
In questi esempi non abbiamo valutato la località degli elementi della lista, immagino che sia un esperimento per un altro giorno. :-)
Suppongo che avrebbero dovuto chiamare la lingua CONP. –