Probleme conso mémoire string (libstdc++)

Probleme conso mémoire string (libstdc++) - C++ - Programmation

Marsh Posté le 05-04-2006 à 14:42:24    

Bonjour
J'utilise des string de la libstdc++ v3 (portée sur un OS en cours de développement). J'ai un probleme de consommation mémoire. En traçant les mallocs qui viennent de la gestion des strings j'ai une méoire allouée 5 à 10 fois plus grande que le nombre de caractère total utilisé.
Par exemple si j'éxécute un main de test avec seulement l'instruction "string s(1, 'a')" et rien d'autre  j'ai un malloc de 640 bytes. Je sais que pour éviter des appels trop fréquents à malloc une plus grande zone que nécessaire est allouée pour etre réutilisée ensuite pour els strings suivantes. Est-ce que ça doit etre le cas meme s'il n'y a pas d'autre string dans le code ?
De plus si je fais plusieurs déclarations et initialisations de string, la mémoire allouée au début n'est pas réutilisée, il y a un autre malloc.
 
Avez-vous une idée ?  
D'autre part des liens de tutoriaux sur le fonctionnement des strings et streams seraient bienvenus (meme dans le Stroustrup que j'ai ce n'est pas détailllé ni dans la doc de libstdc++ -ou alors je cherche comme une chèvre).
 
Cordialement

Reply

Marsh Posté le 05-04-2006 à 14:42:24   

Reply

Marsh Posté le 05-04-2006 à 15:47:24    

montre ta trace : tu parles de malloc ou sbrk ?

Reply

Marsh Posté le 05-04-2006 à 16:28:38    

Ma trace ?
c'est bien malloc (j'ai juste ajouté des printf dans la libc dans malloc).

Reply

Marsh Posté le 05-04-2006 à 16:39:08    

ah ouais ... bah t'en fait pas, mieux vaut allouer des gros morceaux en prévision de plus, plutot que des micro morceaux à tout va. donc en fait, t'es parano

Reply

Marsh Posté le 05-04-2006 à 18:14:25    

Euh excuse moi perso je bosse j'ai pas envie de déconner.
T'as jamais du bosser sur un système embarqué j'imagine.

Reply

Marsh Posté le 05-04-2006 à 18:50:19    

définis ta propre class allocator
 

Code :
  1. class myAllocator
  2. : public allocator
  3. {
  4. public:
  5.   pointer
  6.   allocate(size_type __n, const void* = 0);
  7.    void
  8.    deallocate(pointer __p, size_type);
  9. };
  10. typedef basic_string<char, char_traits<char>, myAllocator<char> >    myString;

Reply

Marsh Posté le 05-04-2006 à 19:10:58    

bah je vois pas ce que ça change de faire son allocateur. si std::string veut 640o, c'est qu'elle en a besoin.

Reply

Marsh Posté le 07-04-2006 à 10:25:25    

OK merci pour le conseil

Reply

Marsh Posté le 07-04-2006 à 19:07:01    


Faire du C++ sur de l'embarque c'est du foutage of gueule.

Reply

Marsh Posté le 08-04-2006 à 01:49:48    


 
640 bytes, ça me parait beaucoup. Soit il y a un problème dans ta façon de mesurer, soit alors, c'est un bug.
Si tu as valgrind sous la main : $ valgrind ./a.out
Sur mon implementation, j'ai 14 bytes d'alloués pour std::string( 1, 'a' ), puis quand la chaine devient assez grande, la mémoire allouée à l'air d'être a peu près le double de celle demandée. Ceci en prévision d'agrandissement de la chaine, adaptée à une utilisation typique des chaines de caractères.
Après, à toi de voir si le cout en espace est satisfaisant dans le contexte de ton application. Si non, tu peux envisager de ne pas utiliser std::string dans ce cas la. (tu es déjà veinard d'avoir le droit au free store, non ? :) )
 

Citation :

D'autre part des liens de tutoriaux sur le fonctionnement des strings et streams seraient bienvenus (meme dans le Stroustrup que j'ai ce n'est pas détailllé ni dans la doc de libstdc++ -ou alors je cherche comme une chèvre).


pour le fonctionnement des strings et streams, le BS est pas mal. Si tu veux connaitre l'implémentation de *ta* bibliothèque C++, ce n'est plus du ressort du BS (qui se base sur la norme), mais de la doc de libstdc++-v3 -- et ils ne documentent pas la stratégie de consommation mémoire de std::string.
 

Reply

Marsh Posté le 08-04-2006 à 01:49:48   

Reply

Marsh Posté le 08-04-2006 à 01:54:17    

SBAM a écrit :

Faire du C++ sur de l'embarque c'est du foutage of gueule.


ton assertion plutot.

Reply

Marsh Posté le 08-04-2006 à 03:58:34    

++fab a écrit :

ton assertion plutot.


C'est sur que l'interruption d'une structure de controle c/c++ est on ne peut plus adapte a l'embarque http://forum-images.hardware.fr/icones/message/icon10.gif

Reply

Marsh Posté le 08-04-2006 à 09:40:29    

SBAM a écrit :

C'est sur que l'interruption d'une structure de controle c/c++ est on ne peut plus adapte a l'embarque http://forum-images.hardware.fr/ic [...] icon10.gif


?

Reply

Marsh Posté le 11-04-2006 à 17:45:29    

Si cette question d'allocation te tarabuste, rien ne t'empeche de developper soit un allocator à toi soit une mini class string de taille fixe.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed