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 :

création dynamique d'élements et gestion de mémoire


Sujet :

C

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut création dynamique d'élements et gestion de mémoire
    Bonjour,

    Je suis entrain de me faire une petite bibliothèque qui me permet de me créer une liste d'éléments stockés en RAM

    Je pensais a créer ces prototypes pour ma bibliothèque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void initList(MY_LIST * list);
    STRUCT_ELEMENT createElement(MY_LIST * list);
    void addProperty(STRUCT_ELEMENT * element, char name[], int val);
    Cette bibliothèque s'utiliserait comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MY_LIST myList;
     
    initList(&myList);
    STRUCT_ELEMENT * element = createElement(&myList);
    addProperty(element,"toto", 1);
    addProperty(element,"titi", 2);
    addProperty(element,"tutu", 3);
    La question que je me posais est quelle est la meilleure méthode pour allouer la mémoire de mes différents éléments vu que chaque élément peut avoir un nombre de "property" différentes.
    => il faut créer a chaque appele de addProperty() un nouvel espace mémoire (malloc => liste chainée) attaché à l'élément ? ... ou vous voyez d'autres méthodes plus efficaces ?
    => sinon je pensais définir dans la structure STRUCT_ELEMENT un gros buffer puis le réduire une fois l'ajout des "property" terminé (afin de limiter le nombre d'appel à malloc) => mais je ne sais pas trop si c'est faisable facilement en langage C

    Merci d'avance

  2. #2
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Par défaut
    Bonjour ,
    je ne vois pas exactement ce que tu aimerais faire!
    Si j'ai bien compris tu peux simplifier ton problème en ayant un tableau d’éléments que tu insères dans une liste chaînée
    dans ce cas le tableau sera dynamique et ta liste aussi.

    tu peux aussi résoudre cela avec une liste chaînée (ou doublement chaînée) qui contiendra plusieurs listes chaînées :chaque élément aura comme valeur l'adresse d'une liste chaînée et les adresses des nœuds suivants et (précédent) (il faudra implémenter les fct nécessaires)

    j'espère que tu as compris ce que je veux dire (si je me suis mal exprimé je m'exprimerais différemment)
    Bon courage

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    johnlobs tu n'as pas compris. Ce qui pose problème c'est le nombre d'appel à malloc

    Il faudrait un cas plus précis mais malloc est optimisé et tu n'as pas trop le choix.

    Effectivement tu peux faire un malloc pour allouer un gros buffer, à l'ancienne char chunk[5000];.
    Mais dans ton cas tu as des chaines de caractères que tu ne connais pas la longueur et/ ou faire attention aux pointeurs (4 ou 8 octets)

  4. #4
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Par défaut
    Bonjour,

    je pense que ce n'est pas une question de compréhension mon cher ami...

    Avant de m'accuser tu pourrais d'abord me demander de t'expliquer ma vision.

    Ce que vous voulez faire ne se fait pas mes chers on va pas allouer statiquement de la mémoire [5000] c'est du gachis mes amis c pas sympas pour la memoire si le besoin n'est que de 10??et quand tu voudras ton 6000 ieme élément tu crée un nouvel espace?
    ce qui se fait est quelque chose de plutôt dynamique et stocké en mémoire de manière aléatoire

    si je n'est pas compris je suis prêt à essayer de comprendre des choses bien ecrites...
    Bon courage

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Bonjour,

    Citation Envoyé par johnlobs Voir le message
    Bonjour,

    je pense que ce n'est pas une question de compréhension mon cher ami...

    Avant de m'accuser tu pourrais d'abord me demander de t'expliquer ma vision.

    Ce que vous voulez faire ne se fait pas mes chers on va pas allouer statiquement de la mémoire [5000] c'est du gachis mes amis c pas sympas pour la memoire si le besoin n'est que de 10??et quand tu voudras ton 6000 ieme élément tu crée un nouvel espace?
    ce qui se fait est quelque chose de plutôt dynamique et stocké en mémoire de manière aléatoire

    si je n'est pas compris je suis prêt à essayer de comprendre des choses bien ecrites...
    Bon courage
    "bien ecrites" hein ...

    On a compris que tu préfères les listes chaînées aux tableaux statiques, mais pour allouer un nouvel élément sur la liste, il faut bien faire quelque part un appel un malloc() non ? Or c'est là tout le problème ...

    A part ça, foetus a bien résumé : malloc() est plutôt bien optimisée (pour allouer de la mémoire dans la plus grande majorité des cas), mais on peut toujours implémenter un memory pool dans le cas où on veut allouer des blocs de mémoire de taille fixe (uniquement des pointeurs, par exemple). Après cela dépend de la manière dont les propriétés sont stockées : on copie le pointeur sur la chaîne ou la chaîne ? Dans le premier cas, un gros buffer est raisonnable ; dans le deuxième, il deviendrait inutile, car la complexification du code annulerait le gain de performances.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    Bon avant que vous vous aillez entretué, je vais compléter ma demande

    J'ai plein d'éléments a ajouter dynamiquement => je ne connais pas à l'avance le nombre d'éléments ni leur taille (car le nombre de propriétés par élément est aussi inconnu à l'avance).

    Je voulais évité les malloc car lorsqu'on réserve de petits champs de mémoire (ex: 2 octets), il y a encore plus d'octets qui sont réservés par le processus interne du malloc pour indiquer la taille de la zone mémoire et où elle se situe => donc perte de d'espace mémoire conséquent s'il y a beaucoup d propriétés attachées à un élément.

    C'est pour ça, je me demandais s'il n'était pas possible de faire un gros malloc au départ à la création de "l'objet" puis de réduire sa taille (il ne me semble pas que ça soit possible).
    On peut faire un realloc pour réduire la taille de la zone ? Est-ce que le realloc va réellement réduire la zone où il va en récréer une nouvelle en faisant une copie de la précédente zone (on aura donc une perte de temps sur la recopie) ?

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    On peut faire un realloc() pour réduire la taille d'un bloc alloué de mémoire, mais je vois peu d'intérêt à allouer une zone de mémoire pour la réduire après ... sauf si on sait qu'il y aura peu, ou qu'il n'y aura plus, de propriétés ajoutées à tel élément.

    D'après la documentation, realloc() est susceptible de déplacer de la mémoire. De là à savoir si une copie du bloc de mémoire est réellement effectuée ... il faudrait faire des tests, mais les résultats varieront sûrement en fonction du compilateur et de l'environnement.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 170
    Par défaut
    Bonjour,

    On a compris que tu préfères les listes chaînées aux tableaux statiques
    Ce n'est pas une préférence personnelle c'est une suggestion pour résoudre un problème.

    je ne connais pas à l'avance le nombre d'éléments ni leur taille
    c'est pour cela que je propose "les listes chaînées imbriquées" (désolé si c'est la hantise des développeurs)

    on peut toujours implémenter un memory pool dans le cas où on veut allouer des blocs de mémoire de taille fixe (uniquement des pointeurs, par exemple)
    mais cela doit être dynamique pour les pointeurs aussi

    autoriser realloc à manipuler des espaces mémoires qui ne sont pas issus des fonctions de la bibliothèque standard pourrait causer des erreurs, ou des incohérences graves de l'état du processus
    pour allouer un nouvel élément sur la liste, il faut bien faire quelque part un appel un malloc() non
    chaque élément est une liste donc le malloc concerne "les propriétés" de l’élément

    Bon avant que vous vous aillez entretué
    (s'entre-tuer au subjonctif(passé)->http://fr.wiktionary.org/wiki/Annexe...7ais/entretuer)


    Nous sommes ici pour échanger des idées et discuter afin de dégager une solution adéquate et formellement acceptée puis adoptée et aussi afin de corriger nos" lacunes" (c'est bien ça le but)
    Je pense avoir trop parlé je te laisse le soin de faire tes recherches de manière pro-active et non réactive
    J'espère n'avoir offensé personne avec mes messages car ce n'est pas du tout mon but
    Bon courage pour la suite

  9. #9
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par johnlobs Voir le message
    mais cela doit être dynamique pour les pointeurs aussi
    Rien n'empêche de faire une liste chaînée de memory pools ...

    Citation Envoyé par johnlobs Voir le message
    (s'entre-tuer au subjonctif(passé)->http://fr.wiktionary.org/wiki/Annexe...7ais/entretuer)
    Citation Envoyé par johnlobs
    si je n'est pas compris
    ...

    Citation Envoyé par johnlobs Voir le message
    Nous sommes ici pour échanger des idées et discuter afin de dégager une solution adéquate et formellement acceptée puis adoptée et aussi afin de corriger nos" lacunes" (c'est bien ça le but)
    Je suis absolument d'accord.

    Citation Envoyé par johnlobs Voir le message
    J'espère n'avoir offensé personne avec mes messages car ce n'est pas du tout mon but
    Bon courage pour la suite
    Ce n'était pas le mien non plus, ne pas prêter attention au ton que je prends parfois. Veuillez m'excuser si c'est trop tard.

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    Par défaut
    oki merci pour vos réponses

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

Discussions similaires

  1. Création Dynamique Button avec gestion événement
    Par anabou dans le forum ASP.NET
    Réponses: 12
    Dernier message: 07/01/2009, 19h31
  2. [VMS] Chargement dynamique de module et gestion de la mémoire
    Par gege2061 dans le forum Autres systèmes
    Réponses: 0
    Dernier message: 09/01/2008, 18h25
  3. [Rave Report] problème de création dynamique
    Par Nivux dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2003, 00h07
  4. TWebBrowser et création dynamique
    Par BakaOnigiri dans le forum Web & réseau
    Réponses: 2
    Dernier message: 01/09/2002, 10h53
  5. Création dynamique de TImages
    Par Dric dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/07/2002, 12h36

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