Se connecter / S'enregistrer
Votre question

Question d'optimisation... pour un buffer et fuite de mémoire ?.

Tags :
  • Buffer
  • Programmation
Dernière réponse : dans Programmation
10 Avril 2012 15:46:03

Bonjour,

J'ai besoin de mettre en place un buffer pour un de mes programmes,
La question que j'me posais c'est quelle est la méthode la plus légère entre l'utilisation d'une liste chainée
et d'une table statique ? A savoir que le buffer sera tout petit (entre 2 et 6 cases) l'opération la plus fréquente dessus sera le décalage de ces valeurs. Concrètement ça ressemblerait à ça.


Bon après pour le code, normalement c'est bon, c'est même de la tripote là.
Me manque juste un détail. On a un prof maniaque du pointeur de pointeur, du coup j'ai un doute sur une partie de code...

genre là :
  1. int main()
  2. {
  3. test_t * test;
  4. test_t * test2;
  5.  
  6. //On imagine il se passe plein de trucs...
  7. ...
  8. //Et là, il est venu le temps de désallouer la mémoire.
  9.  
  10. test_detruire(test);
  11.  
  12. test_detruire2(&test2);
  13.  
  14. return 0;
  15. }
  16. void test_detruire(test_t *v)
  17. {
  18. free(v);
  19. }
  20.  
  21. void test_detruire2(test_t **v)
  22. {
  23. free(*v);
  24. }

Du coup j'suis embrouillé la dessus... l'un marche aussi bien que l'autre non ? vu que le free désalloue l'espace pointé, non ?

Merci pour vos réponses.

Autres pages sur : question optimisation buffer fuite memoire

a b L Programmation
10 Avril 2012 22:45:53

1. Que veux tu dire exactement par décalage de valeur?

2. Tes 2 fonctions font la même chose. Dans ton 2ème cas, tu envoie en paramètre (sur la pile) une adresse mémoire qui pointe sur une autre adresse mémoire qui pointe sur le buffer, donc le free(*v); est correct.
Si tu veux affecter NULL au pointeur après avoir détruit le buffer, alors tu ne peux pas utiliser la première fonction car tu envoies sur la pile directement l'adresse mémoire du buffer, et comme sur la pile c'est une copie, si tu fais v=NULL; alors tu mets à NULL l'adresse qui est sur la pile et pas le pointeur test (qui se trouve dans le tas). La pile est dépilé à la fin de la fonction et tu perds ton affectation à NULL.
Dans ta 2ème fonction, sur la pile tu copies une adresse mémoire qui pointe sur l'adresse mémoire test2 (qui pointe sur le buffer). Donc, là tu peux modifier l'adresse mémoire du pointeur test2 en modifiant *v qui ne pointe pas sur la pile, mais bien sur le tas (là où tu fais les allocations dynamiques).
m
0
l
10 Avril 2012 23:21:34

Ah désolé, j'ai oublié le screenshot pour la première question :/ 


Pour la seconde question, okay merci.
Donc la seconde solution est sympatoche pour metre à null le pointeur direct dans la fonction.
c'est bon a savoir.
m
0
l
a b L Programmation
13 Avril 2012 20:00:20

Le tableau est pratique pour un accès par index (parce qu'en liste chainée, il faut passer par tous les éléments pour trouver le n-ième élément).
La liste chainée est pratique pour les insertions et suppressions (parce qu'avec un tableau, il faut faire plusieurs décalages comme tu décris).

Evidemment, pour seulement 6 cases, que tu choisisses une méthode ou une autre, ça n'a pas d'importante, mais imagine que tu as 100000 éléments, alors tu peux facilement imagine ce qui serait le plus rapide à faire.
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS