HeapAlloc vs. VirtualAlloc vs. malloc



  • Also eigentlich würde ich fast immer new und delete verwenden (vorausgesetzt C++). Aber du wirst doch während du renderst keinen Speicher allokieren? Wofür genau brauchst du es denn?



  • Ich benötige es um z.B. Terrain oder Modelle zu speichern. - Möchte nur jetzt von den **Standard C++ Funktionen auf die Win32 Funktionen umsteigen.

    M.T.**



  • Möchte nur jetzt von den Standard C++ Funktionen auf die Win32 Funktionen umsteigen.

    Warum?

    also wenn C statt C++ dann malloc. IMHO ist der Unterschied nur, wie und von wo auf den Speicher zugegriffen werden kann. Von der Geschwindigkeit her nimmt sich das letztendlich nicht viel und deine Terrains oder Modelle erstellst du ja vor dem Rendern, weshalb selbst wenns ein bisschen länger dauert ja nicht gleich die Welt zusammenbricht :).



  • Genau. Und Zerbst nimmt, soweit ich weiß, auch new und delete.

    cya



  • Zerbst benutzt auch statisches Terrain (würd ich nie machen) - Tschuldigung Stefan 😉 . Ich hab jetzt gerade mal mit VirtualAlloc rumgetestet. Kann es sein, dass es in ner DLL mit mehreren Instanzen Problemem macht?

    M.T.

    [ Dieser Beitrag wurde am 21.12.2002 um 13:51 Uhr von Manuel editiert. ]



  • wenn du speed willst würde ich new s überladen, für jede klasse ein etxra angepastes, das kann ware wunder volbringen
    es gab mal ein heap speed vergleich zwischen java und c++, java lag bei ~7 sek und c++ ~60 sek

    dan habe ich new überladen und auf den test angepast und raus kam ~4 sek



  • Ich steh jetzt gerade aufm Schlauch 😞 kannst du mal n bisschen Code posten, wie du das gemacht hast?

    Danke

    M.T.





  • Danke euch allen.
    Ich werd mal n bisschen rumexperimentieren 🙂

    M.T.



  • hier ist der thread Wie heißt der Nachfolger ...

    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    #include <deque>
    
    std::deque<int> pool;
    
    class TestClass
    {
       private :
       int number;
    
       public :
    
       TestClass (int i)
       : number (i)
       {
       }
    
       int getNumber ()
       {
          return number;
       }
    
       void setNumber (int i)
       {
          number = i;
       }
    
       void * operator new (size_t)
       {
           pool.push_back(0);
           return &pool.back();
       }
    
       void operator delete(void * s)
       {
           if(&pool.front() == s)
               pool.pop_front();
           else
               for(std::deque<int>::iterator i = pool.begin(); i != pool.end(); ++i)
               {
                   if(&(*i) == s)
                   {
                       pool.erase( i );
                       break;
                   }
               }
       }
    };
    
    int main(int argc, char *argv[])
    {
      int size = 500;
      long  sum = 0;
      clock_t time;
    
      TestClass ** array = new TestClass* [size];
      int i,j;
    
      time = clock();
      for (j = 0 ; j < 200000 ; ++j)
      {
        for (i = 0 ; i < size ; ++i)
        {
          array[i] = new TestClass(i);
        }
        for (int i = 0 ; i < size ; ++i)
        {
          sum += array[i]->getNumber ();
          delete array[i];
        }
      }
      delete [] array;
      std::cout << clock() - time;
    
      system("PAUSE");   
      return 0;
    }
    

Anmelden zum Antworten