IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

malloc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut malloc
    Bonjour,

    J'ai une question a propos du malloc, pourquoi faut il allouer la memoire par bloc de 1,2,4,8,16,32,64.... ?

    Pareil lorsque je realloue la memoire d'une chaine, pourquoi est il déconseillé de faire une reallocation du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int size_pointeur;
    char * pointeur;
    pointeur= realloc(pointeur, (size_pointeur+1)*1)
    plustor qu'un reallocation par bloc successif de 16, 32 ,64....

    Merci.[/code]

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: malloc
    Citation Envoyé par zbooon
    J'ai une question a propos du malloc, pourquoi faut il allouer la memoire par bloc de 1,2,4,8,16,32,64.... ?
    Qui a dit ça ?
    Pareil lorsque je realloue la memoire d'une chaine, pourquoi est il déconseillé de faire une reallocation du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int size_pointeur;
    char * pointeur;
    pointeur= realloc(pointeur, (size_pointeur+1)*1)
    plustor qu'un reallocation par bloc successif de 16, 32 ,64....
    Ah, ok.

    C'est une question d'efficacité de l'algo. La progession 'en doublant à chaque fois' est une manière simple de créer une progression géométrique qui va permettre de trouver une taille 'qui va bien' rapidement, même si elle déborde un peu... On perd un peu en mémoire, mais on gagne en nombre d'appels... Si on doit compter les bytes, on peut toujours finaliser avec un dernier realloc() ajusté...

    C'est un peu le principe inverse de la recherche dichotomique, et ça se rapproche de la répartition des pièces et billets en 1,2,5, ou des résistances en 10 22 47 (séries Renard). C'est une application des propriétés des logarithmes (les vrais matheux t'expliqueront ça mieux que moi).

    Rien de tout ça n'a à voir avec le langage C...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut
    a ok je me suis trompé pour le malloc, mais le realloc c'est donc pour eviter le nombre d'appel trop important, comme ca on évite les erreurs?

    Donc je realloue successivement en doublant et lorsque j'ai reallouer a 64, et qu'il y a 57 byte, rien ne m'empéche de faire une sorte de "reallocation final" a 57 a la fin de mon algo si j'ai bien compris?
    [/code]

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par zbooon
    a ok je me suis trompé pour le malloc, mais le realloc c'est donc pour eviter le nombre d'appel trop important, comme ca on évite les erreurs?
    C'est plutôt qu'on gagne du temps et qu'on fragmente moins la mémoire... (Un appel a realloc() a la réputation d'être couteux, surtout quand il doit recopier les données. En fait ca dépend énormement de l'implémentation... dans le doute, moins d'appels, caÿ mieux.
    Donc je realloue successivement en doublant et lorsque j'ai reallouer a 64, et qu'il y a 57 byte, rien ne m'empéche de faire une sorte de "reallocation final" a 57 a la fin de mon algo si j'ai bien compris?
    Tu peux. Attention à laisser de la place pour le zéro final si c'est une chaine.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur windows lors du malloc
    Par Elessar dans le forum C
    Réponses: 5
    Dernier message: 16/12/2003, 08h53
  2. malloc et free
    Par barthelv dans le forum C
    Réponses: 3
    Dernier message: 22/07/2003, 18h34
  3. Pb : malloc qui marche une fois sur deux .... ?
    Par guillaume_pfr dans le forum C
    Réponses: 14
    Dernier message: 21/07/2003, 09h52
  4. Erreur de sgmentation avec malloc
    Par simonm dans le forum C
    Réponses: 5
    Dernier message: 27/02/2003, 08h29
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo