pourquoi .net n’alloue-t-il pas de la mémoire lors de l’initialisation d’un tableau 2D?

var a = new double[7000,7000]; FillValue(a,3); 

Il semble que .Net n’alloue pas de mémoire à a après avoir exécuté la première ligne. Ce n’est que pendant l’exécution de l’appel FillValue que la mémoire est progressivement consommée. (environ 400 Mo)

Quelqu’un peut-il me fournir plus de détails à ce sujet? Je pensais a est rempli de 0 après l’initialisation par défaut, comment pourrait-il ne pas prendre de mémoire du tout?

Dans Windows, il existe deux méthodes pour “allouer de la mémoire”: pour “réserver” et pour “engager” de la mémoire.

Le gestionnaire de tâches affiche uniquement “Historique d’utilisation de la mémoire physique”; la machine virtuelle .NET n’utilise apparemment que de la mémoire réservée lorsque vous allouez un tableau, puis effectue un retour en arrière et valide les parties utilisées.

De cette façon, vous pouvez réserver de la mémoire sans la récupérer, ce qui est plus efficace, et réserver de la mémoire, selon MSDN, “réserve une plage de l’espace d’adressage virtuel du processus sans allouer de mémoire physique réelle dans la mémoire ou dans le fichier d’échange sur le disque. “. C’est pourquoi le gestionnaire de tâches ne l’affiche pas.

Vous pouvez en savoir plus à ce sujet sur la page VirtualAlloc sur MSDN.

Il s’agit d’un détail d’implémentation, vous ne devez donc pas vous en fier. La machine virtuelle mono, par exemple, est susceptible de se comporter différemment.

En fait, il alloue de la mémoire comme vous pouvez le voir ici:

http://ideone.com/Cd4BR1

 Console.WriteLine("Memory before: {0}",GC.GetTotalMemory(true)); var a = new double[5000,5000]; Console.WriteLine("Memory after: {0}",GC.GetTotalMemory(true)); Memory before: 118784 Memory after: 200224768 

(Nécessaire pour réduire la taille du tableau afin d’empêcher une OutOfMemoryException sur ideone)

Méthode GC.GetTotalMemory

Récupère le nombre d’octets que l’on pense actuellement être alloués.