[C++] Probleme d'allocation memoire avec new

Probleme d'allocation memoire avec new [C++] - C++ - Programmation

Marsh Posté le 05-09-2003 à 18:59:34    

Voici un petit code de test :
 

Code :
  1. class Obj
  2. {
  3. public:
  4. int a;
  5. int b;
  6. int c;
  7. Obj(int A, int B, int C);
  8. ~Obj();
  9. };
  10. Obj::Obj(int A, int B, int C)
  11. {
  12. this->a = A;
  13. this->b = B;
  14. this->c = C;
  15. }
  16. Obj::~Obj()
  17. {
  18. }
  19. int main(int argc, argv char **)
  20. {
  21. for(int i=0; i<1000000; i++) {
  22. Obj *obj = new Obj(i,i+1,i+2);
  23. }
  24. char t;
  25. scanf("%c",&t);
  26. return(0);
  27. }


 
Si je calcule theoriquement la quantite de memoire alloué :
3*sizeof(int) octets par objects = 12 octets/ objects
Donc pour 1 million d'objects :
12*100000 /1024 =  11718 Ko
 
Or si je regarde effectivement ce qui est alloué (gestionnaire des taches), j'ai :
32556 Ko
Donc 32 Mo alloué au lieu de 12 Mo prevu....
 
Quelqu'un peut m'expliquer pourquoi ?


Message édité par fykman le 05-09-2003 à 19:00:26
Reply

Marsh Posté le 05-09-2003 à 18:59:34   

Reply

Marsh Posté le 05-09-2003 à 19:09:09    

65376KO chez moi

Reply

Marsh Posté le 05-09-2003 à 19:10:17    

polo021 a écrit :

65376KO chez moi


faut compiler en release...  ;)

Reply

Marsh Posté le 05-09-2003 à 19:16:38    

déjà du bon code
 

Code :
  1. class Obj
  2. {
  3. public:
  4.   int a;
  5.   int b;
  6.   int c;
  7.  
  8.   Obj(int A, int B, int C);
  9. };
  10.  
  11. Obj::Obj(int A, int B, int C)
  12.   : a(A), b(B), c(C)
  13. {}
  14. #include <iostream>
  15.  
  16.  
  17. int main(int argc, char *argv[])
  18. {
  19.   for(int i=0; i<1000000; ++i)
  20.     {
  21.       Obj *obj = new Obj(i, i+1, i+2);
  22.     }
  23.   char c;
  24.   std::cin >> c;
  25. }


 
 
après, c'est complètement non fiable cette technique, mieux vau te tourner vers ton API si tu veux des infos

Reply

Marsh Posté le 05-09-2003 à 19:22:19    

Ok pour le code propre,  
par contre le probleme ne viens pas du gestionnaire des taches j'en suis sur (si il se plantait de 20 mo, ca se saurait, hein).
J'ai dans l'idée qu'il doit y avoir une taille minimum de 32 octets allouée par le new... car si on rajoute un autre int a la classe, la taille ne bouge pas.
Mais c'est une suppostion et j'aimerais avoir l'avis d'un connaisseur...  

Reply

Marsh Posté le 05-09-2003 à 19:23:33    

fykman a écrit :

Ok pour le code propre,  
par contre le probleme ne viens pas du gestionnaire des taches j'en suis sur (si il se plantait de 20 mo, ca se saurait, hein).

ça se sait
 
sinon regarde le code source de ton allocateur mémoire ... mince tu peux pas. tant pis

Reply

Marsh Posté le 05-09-2003 à 19:26:32    

Taz a écrit :

ça se sait


 
 :pfff:, denigrement systematique et purement subjectif de windows..

Reply

Marsh Posté le 05-09-2003 à 19:28:50    

fykman a écrit :


 
 :pfff:, denigrement systematique et purement subjectif de windows..
 

non, c'est un fait qu'on ne peut pas se fier au gestionnaire des tâches.
 
 
enfin classiquement, les allocateurs pour petits morceaux de mémoire sont basé sur le principe de la buddy list

Reply

Marsh Posté le 05-09-2003 à 19:43:13    

Taz a écrit :

enfin classiquement, les allocateurs pour petits morceaux de mémoire sont basé sur le principe de la buddy list  


 
quel est-il ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 05-09-2003 à 19:43:46    

fykman a écrit :


Quelqu'un peut m'expliquer pourquoi ?


 
parce qu'un allocateur de mémoire utilise de la mémoire à son propre usage pour garder trace de certaines informations (comme par exemple la taille d'un bloc alloué).

Reply

Marsh Posté le 05-09-2003 à 19:43:46   

Reply

Marsh Posté le 05-09-2003 à 19:46:24    

http://www.nist.gov/dads/HTML/buddysystem.html pas terrible    [:spamafote]  
il est bien décris dans le O'Reilly sur le noyau Linux  :D  
 
bon je joue google
http://www.memorymanagement.org/articles/alloc.html
http://paul.rutgers.edu/~jarai/314/buddy.html

Reply

Sujets relatifs:

Leave a Replay

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