2010-10-28 4 views
7

Ich neige dazu, std * Allok/freie Funktionen zu verwenden, um dynamischen Speicher in meinen C-Programmen zu reservieren. Ich frage mich, ob es irgendwelche gute Gründe gibt, die GLIB Memory Allocation functions anstelle der Std-Einsen zu verwenden.glib Speicherzuweisung VS Std * Alloc und frei

Ich wäre dankbar, wenn die Community auf Situationen hinweisen könnte, in denen eine dieser Lösungen ein Gewinner/Verlierer ist. Ich bin auch an Leistungsproblemen interessiert, die ich treffen könnte, falls ich das eine oder das andere verwende.

Danke!

Edited Zustand Plattformen

Diese Programme normalerweise auf alle Arten von Linux/Unix-Distributionen laufen, normalerweise 64 Bits Archs mit gcc 4.2 kompiliert.

Antwort

5

Meiner Meinung nach ist der wertvollste Unterschied zwischen den GLib-Funktionen und denen der Standardbibliothek, dass die GLib-Funktionen das Programm abbrechen, wenn die Zuweisung fehlschlägt. Keine Überprüfung mehr, ob der Rückgabewert von malloc()NULL ist! Ansonsten gibt es keinen Unterschied in der Zuweisungsstrategie - g_malloc() Anrufe malloc() intern, obwohl wie eine der anderen Antworten hier angibt, ist es möglich, das zu ändern.

Ein weiterer Unterschied besteht darin, dass die GLib-Funktionen eine (rudimentäre) Speicherleckprüfung mit g_mem_profile() ermöglichen.

GLib hat auch eine slice allocator, die effizienter ist, wenn Sie viele gleich große Speicherblöcke zuweisen. Dies verwendet nicht das System malloc() und free(), aber es ist wiederum möglich, das zu Debugging-Zwecken zu ändern.

+0

Unter Linux schlägt die Zuweisung sowieso nie fehl. (Mit Standard-Kernel-Einstellungen.) Also, obwohl ich immer malloc Rückgabewert überprüfen, würde ich mich sonst schmutzig fühlen, dieser Code-Pfad wird sowieso nie verwendet. –

+0

Ich habe die Rückgabewerte von malloc vor langer Zeit aufgegeben. Was werden Sie tun, wenn Ihnen der Speicher ausgeht? Die Chancen stehen gut, dass Sie nicht einmal eine Nachricht an stderr schreiben können. Es erscheint angemessen, das Programm, das sowieso stattfindet, abzubrechen, sobald der Null-Zeiger dereferenziert wird. – JeremyP

+0

@ JeremyP, genau!Deshalb würde ich das Programm lieber abbrechen. Ich kann mir einen Anwendungsfall vorstellen, um zu testen, ob genügend Speicher vorhanden ist, um etwas zuzuweisen, aber für diese Fälle gibt es immer 'g_try_malloc()'. – ptomato

2

hängt von der zugrunde liegenden Architektur ab. Unter SCO Unix f. Der malloc folgt der "best-fit" -Strategie, die speicheroptimiert aber geschwindigkeitsabgrenzend ist.

Wenn also Ihr Programm von einer speziellen Annahme auf verschiedenen Systemen/Plattformen abhängt, ist es immer gut, die Kontrolle über die Malloc-Strategie zu haben.

+0

Meine Programme laufen immer auf Linux/Unix-Plattformen, und ich nehme an, dass die stdglibc malloc-Implementierungen auf all diesen Systemen der gleichen Strategie folgen müssen. Habe ich recht ? (Frage bearbeitet zur Zustandsarchitektur). Danke für deine Antwort. –

+1

@msvalvadores, rechts. Fast alle Linux-Distributionen verwenden glibc (nicht mit GLIB verwechseln) malloc. Diejenigen, von denen du wahrscheinlich noch nie etwas gehört hast. –

4

Wenn Sie aus irgendeinem Grund die zugrunde liegende Zuweisungsstrategie selbst steuern möchten, können Sie g_mem_set_vtable() verwenden, um Ihre eigenen Funktionen anstelle von malloc()/free() zu verwenden.

Dies ist mit malloc/free auch über magische Verknüpfungsoptionen möglich, aber GLIB stellt eine explizite API dafür zur Verfügung, sowie die Möglichkeit, Ihre eigene Zuweisung und freie Protokollierung mit einer hinzuzufügen.

+0

Guter Punkt ein eingebauter Profiler ist immer etwas zu beachten. Vielen Dank. (+1) –