‘calloc’ ne consum pas automatiquement de la mémoire hors de la RAM

Selon la réponse à cette question:

Différence entre malloc et calloc?

Isak Savo explique que:

calloc touche effectivement la mémoire (il écrit des zéros) et vous serez ainsi assuré que le système d’exploitation sauvegarde l’allocation avec de la mémoire vive réelle (ou swap). C’est aussi pourquoi il est plus lent que malloc (non seulement il doit le mettre à zéro, mais le système d’exploitation doit également trouver une zone mémoire adéquate en permutant éventuellement d’autres processus).

Alors j’ai décidé d’essayer moi-même:

#include  #include  #define ONE_MB = 1048576 int main() { int *p = calloc(ONE_MB, sizeof(int)); int n; for(n = 0; n != EOF; n = getchar()) ; /* Gives me time to inspect the process */ free(p); return 0; } 

Après avoir exécuté cette application, le gestionnaire de tâches de Windows m’indiquait que seuls 352 Ko étaient utilisés sans mémoire vive.

allocation de mémoire calloc

Il apparaît que le bloc de 1 Mo que j’ai alloué n’est pas sauvegardé en RAM par le système d’exploitation.


Par contre, si j’appellerais malloc et initialiserais manuellement le tableau:

 #include  #include  #define ONE_MB = 1048576 int main() { int *p = malloc(sizeof(int) * ONE_MB); int n; /* Manual Initialization */ for(n = 0; n < ONE_MB; n++) memory[n] = n; for(n = 0; n != EOF; n = getchar()) ; /* Gives me time to inspect the process */ free(p); return 0; } 

Le Gestionnaire des tâches me montrerait que l’application utilise actuellement 4,452 Ko de RAM.

Malloc et allocation manuelle d'initiation de mémoire


Isak s’est-il trompé dans son argument? Si oui, que fait alors calloc ? Ne met-il pas à zéro le bloc de mémoire entier, et donc le ” touche ” comme je l’ai fait?

Si tel est le cas, pourquoi la RAM n’est-elle pas utilisée dans le premier échantillon?

Il a eu tort dans le point, qu’il est beaucoup plus lent à cause de cela doit écrire 0 dans le bloc en premier.

Tout système d’exploitation codé de manière intelligente prépare de tels blocs à de telles fins ( calloc() n’est pas le seul cas où de tels blocs sont utilisés) et si vous appelez calloc() il ne fait calloc() un tel bloc de mémoire à zéro au processus, au lieu d’un fichier non initialisé. comme elle pourrait le faire en appelant malloc() .

Donc, il gère ces blocs de mémoire de la même manière. et si le compilateur / système d’exploitation décide que vous n’avez pas encore / encore besoin de la totalité des 1 Mo, il ne vous donne pas non plus un bloc complet de 1 Mo de la mémoire mise à zéro.

Dans Jusqu’où il avait raison: si vous appelez fortement calloc() et utilisez également la mémoire, le système d’exploitation pourrait sortir de la mémoire mise à zéro, qui avait probablement été préparée au cours d’une période d’inactivité.

Cela causerait en effet un peu plus de ralentissement du système, car le système d’exploitation est forcé par un appel à calloc() d’écrire les 0 dans le bloc en premier.

Mais pas du tout: il n’y a pas de réglementation à savoir si malloc / calloc doit allouer la mémoire lors de l’appel ou simplement lorsque vous utilisez la mémoire. Votre exemple particulier dépend donc du traitement de votre système d’exploitation.