Voir ma réponse sur la localité spatiale et temporelle .
En particulier, les tableaux sont des blocs de mémoire contigus, de sorte que de grandes parties d'entre eux seront chargées dans le cache lors du premier accès. Il est donc relativement rapide d'accéder aux futurs éléments du tableau. En revanche, les listes chaînées ne se trouvent pas nécessairement dans des blocs de mémoire contigus et peuvent entraîner un plus grand nombre d'erreurs de cache, ce qui augmente le temps nécessaire pour y accéder.
Considérons les configurations de mémoire suivantes pour un tableau data
et liste chaînée l_data
de grandes structures
Address Contents | Address Contents
ffff 0000 data[0] | ffff 1000 l_data
ffff 0040 data[1] | ....
ffff 0080 data[2] | ffff 3460 l_data->next
ffff 00c0 data[3] | ....
ffff 0100 data[4] | ffff 8dc0 l_data->next->next
| ffff 8e00 l_data->next->next->next
| ....
| ffff 8f00 l_data->next->next->next->next
Si nous voulions parcourir ce tableau en boucle, le premier accès à ffff 0000
nous obligerait à aller dans la mémoire pour la récupérer (une opération très lente en termes de cycles de CPU). Cependant, après le premier accès, le reste du tableau se trouverait dans la mémoire cache et les accès suivants seraient beaucoup plus rapides. Avec la liste chaînée, le premier accès à ffff 1000
nous obligerait également à nous rendre à la mémoire. Malheureusement, le processeur mettra en cache la mémoire qui entoure directement cet emplacement, c'est-à-dire jusqu'à ffff 2000
. Comme vous pouvez le voir, cela ne capture aucun des autres éléments de la liste, ce qui signifie que lorsque nous accédons à l_data->next
Nous devrons à nouveau faire appel à la mémoire.