Réponse Courte:
Il n'a pas, il arrive juste à être de zéro dans votre cas.
(Également votre cas de test ne montre pas que les données sont à zéro. Il ne s'affiche que si un élément est égale à zéro.)
Réponse Longue:
Lorsque vous appelez malloc()
, l'une des deux choses vont se produire:
- Il recycle mémoire qui a été allouée précédent et libéré à partir du même processus.
- Il demande une nouvelle page(s) du système d'exploitation.
Dans le premier cas, la mémoire contient les données des restes de la précédente allocations. Afin de ne pas être égale à zéro. C'est le cas d'habitude lors de la réalisation de petites allocations.
Dans le second cas, la mémoire sera de l'OS. Cela se produit lorsque le programme s'exécute hors de la mémoire - ou lorsque vous demandez une très large répartition. (comme c'est le cas dans l'exemple)
Le hic, c'est la Mémoire à venir de l'OS sera remis à zéro pour la sécurité .*
Lorsque le système d'exploitation vous donne de la mémoire, il aurait pu être libéré à partir d'un autre processus. De sorte que la mémoire peut contenir des informations confidentielles telles qu'un mot de passe. Afin de vous éviter la lecture de ces données, le système d'exploitation zéro avant qu'il le donne à vous.
*Je note que la norme ne dit rien à ce sujet. C'est strictement un OS comportement. Donc, cette mise à zéro peut ou peut ne pas être présent sur les systèmes où la sécurité n'est pas une préoccupation.
Pour donner plus d'une performance historique de cette:
@R. mentionne dans les commentaires, cette réduction à zéro est pourquoi vous devriez toujours utiliser calloc()
au lieu de malloc()
+ memset()
. calloc()
peuvent profiter de ce fait pour éviter un distinct memset()
.
D'autre part, cette réduction à zéro est parfois un goulot d'étranglement des performances. Dans certaines applications numériques (comme la out-of-lieu de la FFT), vous devez allouer un énorme morceau de rayer de la mémoire. L'utiliser pour effectuer quel que soit l'algorithme, puis gratuit.
Dans ces cas, la réduction à zéro est inutile et les montants de pur frais généraux.
L'exemple le plus extrême que j'ai vu est un de 20 secondes réinitialisation de la surcharge d'un 70-deuxième opération de 48 GO de zéro de la mémoire tampon. (Environ 30% de frais généraux.)
(Accordée, la machine avait un manque de bande passante de la mémoire.)
La solution évidente est de simplement réutiliser la mémoire manuellement. Mais qui nécessite souvent une rupture avec ces interfaces. (surtout si elle fait partie d'une routine de bibliothèque)