2010-10-28 11 views
7

Tendo ad usare le funzioni std * alloc/free per allocare/liberare la memoria dinamica nei miei programmi C. Mi chiedo se ci sono motivi buoni per utilizzare il GLIB Memory Allocation functions invece di quelli standard.allocazione di memoria glib VS std * alloc e free

Sarei grato se la comunità potesse indicare situazioni in cui una di queste soluzioni è un vincitore/perdente. Sono anche interessato a problemi di prestazioni che potrei colpire nel caso io ne usi uno o l'altro.

Grazie!

omesse per piattaforme stato

Questi programmi normalmente eseguiti su tutti i tipi di distribuzioni Linux/Unix, normalmente 64 bit archi compilati utilizzando gcc 4.2.

risposta

5

A mio parere, la differenza più importante tra le funzioni GLib e quelle standard è che le funzioni GLib interrompono il programma se l'allocazione fallisce. Non è più necessario verificare se il valore restituito da malloc() è NULL! A parte questo, non c'è differenza nella strategia di allocazione - g_malloc() chiamate internamente, ma, come indica una delle altre risposte riportate qui, è possibile cambiarle.

Un'altra differenza è che le funzioni GLib consentono di avere (rudimentale) controllo della perdita di memoria utilizzando g_mem_profile().

GLib ha anche un slice allocator, che è più efficiente se si allocano molti pezzi di memoria di uguale dimensione. Questo non utilizza il sistema malloc() e free(), ma, ancora una volta, è possibile modificarlo a scopo di debug.

+0

Su Linux, l'allocazione non fallisce mai. (Con le impostazioni del kernel predefinite.) Quindi, anche se controllo sempre il valore di ritorno di malloc, mi sentirei sporco altrimenti, quel percorso di codice non è mai usato comunque. –

+0

Ho rinunciato a controllare i valori di ritorno di malloc molto tempo fa. Che cosa hai intenzione di fare se hai esaurito la memoria? È probabile che non sarai nemmeno in grado di scrivere un messaggio su stderr. Sembra opportuno interrompere il programma che si verificherà comunque non appena il puntatore nullo viene dereferenziato. – JeremyP

+0

@JeremyP, esattamente!Ecco perché preferirei abortire il programma. Posso immaginare un caso d'uso per verificare se c'è abbastanza memoria per allocare qualcosa, ma per quei casi c'è sempre 'g_try_malloc()'. – ptomato

2

dipende dall'architettura sottostante. Sotto SCO Unix f.e. il malloc segue la strategia "best-fit", che è ottimizzata per la memoria ma delimita la velocità.

Quindi, se il vostro programma dipende da un'ipotesi particolare su diversi sistemi/piattaforme, è sempre opportuno controllare la strategia di malloc.

+0

I miei programmi funzionano sempre su piattaforme Linux/Unix e suppongo che le implementazioni di std glibc malloc su tutti questi sistemi debbano seguire la stessa strategia. Ho ragione ? (domanda modificata per architettura di stato). Grazie per la tua risposta. –

+1

@msalvadores, a destra. Quasi tutte le distribuzioni Linux usano malloc glibc (non confonderlo con GLIB). Quelli che probabilmente non hai mai sentito nominare. –

4

Se per qualche motivo si desidera controllare autonomamente la strategia di allocazione sottostante, è possibile utilizzare g_mem_set_vtable() per utilizzare le proprie funzioni anziché malloc()/free().

Questo è possibile anche con malloc/free tramite le opzioni di collegamento magico, ma GLIB espone un'API esplicita per questo, oltre alla possibilità di aggiungere la propria allocazione e la registrazione gratuita con uno mem-profiler-table.

+0

Un buon punto un profiler incorporato è sempre qualcosa da considerare. Grazie. (+1) –

Problemi correlati