PDA

View Full Version : [c, c++, Api Win] problemi con HeapAlloc che non ho con malloc


Alex_87_xelA
25-08-2009, 11:32
ciao, mi stavo imbattendo in test di velocità tra le varie funzioni e operatori che ci sono a disposizione per c e c++ e api di win per allocare spazio in memoria per vedere quale fosse la più veloce, ma ho notato che l'api HeapAlloc a differenza (ad esempio) di malloc ha (come) un limite di dimensione massima da allocare, e di fatti provando con questo semplice programma, utilizzando valori che hanno per la funzione una dimensione (costante SIZE) accettabile, l'area viene allocata normalmente, mentre quando SIZE diventa grande (non so quanto), la funzione non funziona (suona male o sbaglio detto così hehehe) ossia non alloca memoria.

questo è il programma fatto per testare la velocità delle funzioni e operatori :


typedef double T;
const unsigned int N = 50000;
const unsigned int SIZE = N * sizeof(T);
const unsigned int N_CICLI = 2000000;

//HeapAlloc
//HeapFree
HANDLE handle = HeapCreate(0, SIZE, SIZE);
{
cout << "heap functins\n";
cout << "inizio allocazione di " << N << " elementi di tipo " << typeid(T).name() << " per " << N_CICLI << " volte " << endl;
time_t inizio = clock();

for(register unsigned int i = 0; i < N_CICLI; i++)
{
T *ptr = (T *)HeapAlloc(handle, 0, SIZE);

if(!ptr) cout << "NOOOOOOO" << endl;
else HeapFree(handle, 0, (LPVOID)ptr);
}
float totale = (float)(clock() - inizio) / (float)CLOCKS_PER_SEC;
cout << "fine allocazione ... tempo : " << totale << "s"<< endl << endl;
}
HeapDestroy(handle);


ho modificato lo stesso codice di programma utilizzando

malloc - free
::operator new - ::operator delete
new[] - delete[]

e in questi altri casi la memoria veniva allocata normalmente, come mai ?
come si può aggirare l'ostacolo ?

Alex_87_xelA
26-08-2009, 00:51
ho "risolto" per il momento usando VirtualAlloc(...,..,..) ma se comunque potete darmi una spiegazione in merito alla mia richiesta mi fate un favore.

arrivederci e grazie !