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

Bibliothèque standard C Discussion :

Mallocs et mémoire en gruyère


Sujet :

Bibliothèque standard C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 123
    Points : 85
    Points
    85
    Par défaut Mallocs et mémoire en gruyère
    Bonjour,

    J'ai ouï dire que l'abus de malloc transformait la mémoire en gruyère et qu'il fallait l'éviter.
    Tout d'abord j'aimerai savoir si cela est vrai.

    Je vous expose mon problème:
    J'ai une fonction récursive qui prend un path pour paramètre et se rappelle se passant un autre path composé du path de base + d'un nom de fichier/dossier et ceci sur tout une arborescence. Pour le moment a chaque ré-appel je fais un nouveau malloc.

    J'ai également une "classe" de gestion de chaine de caractères dynamique qui utilise réalloc.

    Est-ce que cela vaut le coup de remplacer ma suite de malloc/free par ma chaine dynamique qui utilise realloc??

    Merci d'avance de vos réponses

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    malloc() c'est la seule façon d'allouer de la mémoire dynamiquement. Il est donc difficile de s'en passer...

    Par contre si tu as un grand nombre de petites structures allouées dynamiquement, il n'est pas forcément très efficace de faire chaque allocation indépendament, car les appels à malloc() sont relativement couteux. Si c'est une zone critique au niveau des perf, il vaut mieux se débrouiller pour faire les allocations par gros blocs. Mais bon c'est de l'optimisation, tant que tu n'en a pas besoin c'est pas la peine de passer du temps là dessus.

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Anonymouse Voir le message
    Est-ce que cela vaut le coup de remplacer ma suite de malloc/free par ma chaine dynamique qui utilise realloc??
    En général c'est le contraire : un realloc d'une certaine taille génère des trous, beaucoup plus difficilement remplissables que des petits allocs/free...

    Si donc on veut maintenir une taille raisonnable (et relativement correcte) de la mémoire, il est préférentiel d'utiliser effectivement des listes chaînées où chaque élément est alloué/libéré séparément, que des tableaux réalloués...

    J'avais fait un schéma il y a un certain temps, faudrait que je fouille. Mais c'est assez facile à comprendre dès qu'on le fait...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 123
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    En général c'est le contraire : un realloc d'une certaine taille génère des trous, beaucoup plus difficilement remplissables que des petits allocs/free...

    Si donc on veut maintenir une taille raisonnable (et relativement correcte) de la mémoire, il est préférentiel d'utiliser effectivement des listes chaînées où chaque élément est alloué/libéré séparément, que des tableaux réalloués...

    J'avais fait un schéma il y a un certain temps, faudrait que je fouille. Mais c'est assez facile à comprendre dès qu'on le fait...
    Bonjours

    Je vous remercie de vos réponses j'ai donc décidé de laisser le code tel-quel.

    Merci

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    j'ai retrouvé le schéma et la discussion :

    post 21/

    et

    Les pointeurs qu'est-ce ?

    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 123
    Points : 85
    Points
    85
    Par défaut
    Ok je viens de lire la discussion.

    Ca tombe bien j'utilise beaucoup les arbres et listes chainées

  7. #7
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    Je ne réponds pas directement à la question - c'est d'ailleurs déjà fait - mais je papote par rapport à la récursivité.

    Le parcours récursif d'une arborescence est un classique indépendant du langage de programmation. Souvent, ça marche très bien dans un contexte, on réutilise dans un autre contexte, et là des soucis - overflow et performance particulièrement - peuvent apparaître. Il est donc important de ne pas sous-optimiser dès le départ. Il faut également être parcimonieux avec les variables propres à chaque "instance"(*).

    Ici, de dernier point ne pose pas de problème, puisque seul le retour du malloc() sera ajouté aux variables locales. En fait généralement au contexte de l'instance dans la pile.

    Mais si le travail utile de la fonction est léger, la séquence [malloc(), vérification, free()] pourra devenir pénalisante. Ensuite, il faut voir que quand le code sera par exemple à un point bas de la pile d'appel, il y aura "beaucoup", voire "très beaucoup", d'instances vivantes, et autant de blocs malloc-és - sur le tas, typiquement -, dont un seul sera actif, celui de l'instance active. La question qui se pose est de savoir si le contenu du bloc d'une instance est utile quand le code n'est plus dans l'instance.

    La question à se poser avant toute autre, c'est: ai-je dans ma fonction des appels récursifs entre un ??alloc() et le free() ou realloc() correspondant ? Ou plus généralement puis-je réorganiser mon code pour obtenir cette caractéristique, quitte à ajouter un free() puis un malloc() pour "passer" un appel récursif ? Ici, pas question de performance, même si ça amène à mettre les appels à ??alloc() et free() dans une boucle, l'important est de savoir si on peut avoir un code fonctionnel sans appel récursif quand un malloc() n'est pas free-é.

    Si la réponse est négative, on peut laisser tomber. Mais très souvent dans la vraie vie, elle sera positive. Il suffit de ne pas placer par habitude les allocations trop tôt et les libérations trop tard. Si plusieurs blocs doivent être alloués en même temps, il faut faire la manip pour chacun de ces blocs.

    L'idée est évidemment d'allouer un [ou plusieurs] bloc avant le premier appel, et de l'utiliser dans la fonction, le même donc pour chaque instance de la fonction.

    Dans le cas le plus simple, la taille du bloc est la même quel que soit le contexte de l'instance. Ou on peut trouver simplemnt et sans hésitation un majorant de cette taille. Dans ce cas, il suffit d'allouer au départ, et d'ajouter le retour (adresse du bloc) aux paramètres de la fonction.

    Un peu plus compliqué: on peut pifométrer un majorant raisonnable, mais avec la possiblité qu'une fois dans l'instance la taille allouée apparaisse insuffisante. Alors l'instance devra décider, à priori faire un free() suivi d'un malloc(), plutôt qu'un realloc(). Il faudra alors ajouter la taille du bloc aux paramètres de la fonction. Là, un petit souci apparait, très clairement si on griffonne le mécanisme d'appel récursif. En gros, l'adresse du bloc et sa taille reçues en paramètre ne seront plus nécessairement valides après un appel récursif. Il faut donc passer en paramètre non plus un void* (ou char*) et un entier, mais un pointeur vers un void* et un pointeur vers un entier. A charge pour l'instance qui réalloue de modifier les valeurs pointées. Plus compliqué à explique q'à faire.

    (*) N'ayant pas trouvé d'autre mot, j'appelle "instance" ce qui est créé à chaque appel de la fonction. Une instance est donc vivante jusqu'à ce que le code retourne (return ou fin de la fonction). Elle est active quand elle est vivante et que le "code est dedans". Tant qu'une instance est vivante, elle possède son propre jeu de variables locales, copie des paramètres comprises.

    Bonne journée,

    Pierre

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Pierre Maurette Voir le message
    (*) N'ayant pas trouvé d'autre mot, j'appelle "instance" ce qui est créé à chaque appel de la fonction. Une instance est donc vivante jusqu'à ce que le code retourne (return ou fin de la fonction). Elle est active quand elle est vivante et que le "code est dedans". Tant qu'une instance est vivante, elle possède son propre jeu de variables locales, copie des paramètres comprises.
    Bonjour, que dirais tu de "frame", je sais, le mot est anglais, d'un autre coté je pense que tout le monde le comprend.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Anonymouse Voir le message
    J'ai ouï dire que l'abus de malloc transformait la mémoire en gruyère et qu'il fallait l'éviter.
    Y'a pas trous dans le gruyère...
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Bonjour,

    Citation Envoyé par nicolas.sitbon Voir le message
    Bonjour, que dirais tu de "frame", je sais, le mot est anglais, d'un autre coté je pense que tout le monde le comprend.
    Je crois qu'en français on dit « cadre de pile ».
    :wq

  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par dapounet Voir le message
    Bonjour,



    Je crois qu'en français on dit « cadre de pile ».
    Effectivement, j'avais oublié le terme en français. Merci.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

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

Discussions similaires

  1. Malloc et affectation de mémoire
    Par Chop_chop dans le forum C++
    Réponses: 33
    Dernier message: 06/04/2007, 11h05
  2. Réponses: 20
    Dernier message: 13/02/2007, 11h50
  3. Réponses: 4
    Dernier message: 20/11/2006, 01h02
  4. Recoder malloc -> Questions sur la mémoire
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 15/03/2006, 18h11
  5. Pb d'allocation mémoire malloc
    Par oz80 dans le forum C++
    Réponses: 5
    Dernier message: 18/11/2005, 17h23

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