HeapAlloc vs. VirtualAlloc vs. malloc



  • Hi,
    welche der im Titel stehenden Funktionen ist am besten geeignet um Speicher zu belegen, der schnell erstellbar/abrufbar ist. Im PSDK steht, dass man HeapAlloc ab 4Mb nicht mehr verwenden sollte (da ab 4Mb langsam), stimmt das? Und ich hab mal gelesen, dass man mit malloc nicht auf den gesamten RAM zugreifen kann, ist das auch richtig?
    Welche Funktion verwendet ihr?

    BTW: Ich möchte die Funktion in einer DX-Engine verwenden, deshalb sollte alles möglichst schnell ablaufen...

    [Edit] Ich ziehe HeapAlloc zurück, hab gerade gelesen, dass man maximal die HeapGröße belegen kann :(. [/Edit]

    Danke

    M.T.

    [ Dieser Beitrag wurde am 21.12.2002 um 11:21 Uhr von Manuel editiert. ]



  • mit malloc kann man unter win32 soviel ich weiß den kompletten speicher zumüllen...war glaub ich nur bei win16 begrenzt..



  • 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