2014-06-23 6 views
1

De manière surprenante à la fois les programmes ont donné la différence entre les deux pointeurs mêmes, même si les types de données étaient différentes .....malloc stocker les métadonnées

Comment fonctionne exactement malloc stocker ses données méta est ce que je tente de trouver avec cette petite expérience ...

Programme 1:

int main() 
{ 
    char *i,*j; 

    i=(char*)malloc (sizeof(char)); 
    j=(char*)malloc (sizeof(char)); 

    printf ("%x\n",i); 

    printf ("%x\n",j); 
return 0; 
} 

sortie:

710010 
710030 

Programme 2:

int main() 
{ 
    int *i,*j; 

    i=(int*)malloc (sizeof(int)); 
    j=(int*)malloc (sizeof(int)); 

    printf ("%x\n",i); 

    printf ("%x\n",j); 
return 0; 
} 

Sortie:

16b8010 
16b8030 

ce que j'avais à l'esprit avant ce programme:

| meta data of i | memory space of i | meta data of j | memory space of j | 

mais les résultats ne confirment pas la théorie ....

+1

FYI: [Ne pas diffuser le résultat de 'malloc'] (http://stackoverflow.com/q/605845/119527). –

+1

^commentaire non pertinent – PRP

+0

la fonction malloc() fonctionne avec des listes doublement liées plus un autre surcoût. Ainsi, les appels malloc successifs ne retourneront pas les adresses aux décalages attendus entre eux. En outre, char est promu à int dans un appel de fonction. En outre, la plupart des implémentations de malloc() fonctionnent avec des multiples de taille minimale pour réduire la quantité de calculs mathématiques nécessaires. En outre, de nombreuses implémentations de malloc() fonctionnent avec des pools de mémoire pré-alloués. Le résultat est que presque toutes les invocations malloc() acquièrent réellement plus de mémoire que prévu. – user3629249

Répondre

4

malloc "arrondi à" les allocations à un ensemble de taille pratique au moment de la compilation pour le bibliothèque. Cela entraîne des affectations et des désallocations suivantes pour fragmenter la mémoire moins que si les allocations ont été créées pour correspondre exactement aux demandes.

malloc stocke ses métadonnées n'est pas réellement pourquoi les valeurs pour les deux sont 0x20 "à part". Mais vous pouvez lire sur une méthode d'implémentation malloc (et amis) here; Voir en particulier les diapositives 16 et 28.

Imaginez le cas d'un programme de manipulation de chaînes, où de nombreuses allocations de tailles différentes se produisaient dans un ordre «aléatoire». De petits morceaux "restants" se développeraient rapidement, laissant des octets de mémoire totalement inutiles répartis entre les morceaux utilisés. malloc empêche cela en satisfaisant toutes les demandes de mémoire dans des multiples de taille minimale (apparemment 0x20 dans ce cas). (OK, techniquement, vous demandez 0x1E octets, il reste 2 octets d'espace "gaspillé" et inutilisés après votre requête. Puisque malloc alloue 0x20 octets au lieu de 0x1E, MAIS il ne restera plus jamais de fragment de 2 octets Ce qui est vraiment bien parce que le métadate pour malloc est nettement plus grand que 2 octets, donc il n'y aurait aucun moyen de garder trace de ces octets.)

+0

pouvez-vous s'il vous plaît élaborer votre réponse un peu .. je voudrais savoir tous les détails d'où exactement malloc stocker ses méta-données et tout ... ?? – PRP

0

malloc utilise normalement un pool de mémoire et "meta data" tenu dans la piscine pas "entre" les morceaux de mémoire alloués.

Questions connexes