Domanda

Mi piacerebbe sapere quale metodo è raccomandato nella programmazione di Windows C: usando malloc o la funzione Win32 HeapAlloc (forse VirtualAlloc?).

Ho letto MSDN Funzioni di gestione della memoria articolo e articoli MSDN riguardanti malloc e HeapAlloc, ma non dicono quale dovrebbe essere usato e in quali situazioni.

È stato utile?

Soluzione

Rimani con malloc a meno che tu non abbia un motivo convincente per usare qualcosa di diverso. Verrà implementato sotto in termini di primitive di allocazione della memoria del sistema operativo, ma non vi è alcun reale vantaggio nell'immergersi su quel livello da soli.

Alcune chiamate API credo che necessitino di un blocco di memoria allocato da un heap di Windows, ma saprai quando ti imbatterai.

O se vuoi fare qualcosa di più avanzato, come usare la memoria condivisa, o devi controllare direttamente le autorizzazioni sulle pagine di memoria, dovrai guardare le chiamate API di Windows come VirtualAlloc.

Altri suggerimenti

VirtualAlloc e i tuoi amici possono darti un vantaggio se hai un sacco di dati da elaborare o se devi comunque preoccuparti di creare il tuo gestore di memoria.

Altrimenti è più facile e ovviamente più portatile usare solo malloc ().

VirtualAlloc ha questa caratteristica elegante chiamata MEM_RESET, che invalida i dati in un blocco di memoria, ma li mantiene allocati. Ciò significa che se è impaginato su disco, Windows non si preoccuperà di ricominciare a cercarlo la prossima volta che lo accederai. È bello se hai molti mega di dati che possono improvvisamente diventare superflui, ma presto avrai qualcos'altro per riempire il buffer.

Distingue anche tra la prenotazione dello spazio degli indirizzi e la richiesta effettiva di memoria. Ci sono alcune cose carine lì se hai una buona ragione per andare a tutti quei problemi.

Un'altra cosa: malloc () è garantito per essere portatile (almeno per qualsiasi implementazione ANSI-C) e più elegante.

In alcune situazioni usando funzioni come HeapAlloc, HeapFree ti semplifica la vita. Un esempio potrebbe essere: una grande applicazione in cui è necessario allocare memoria in un modulo (ad esempio library1.dll) e liberare quella memoria nel modulo principale (ad esempio program.exe). Questo può essere fatto in sicurezza se si utilizzano le funzioni HeapAlloc, HeapResize e HeapFree, ma non è possibile utilizzare la libreria di runtime C (ad es. Malloc, free, resize).

MA: se non hai una buona ragione, dovresti rimanere con le funzioni malloc / free / resize. Inoltre, se è necessario modificare le autorizzazioni della memoria allocata (ad es .: per rendere se eseguibile, ecc.), È necessario utilizzare funzioni come VirtualAlloc, VirtualFree.

È possibile creare un wrapper e lasciare l'opzione per modificare i dettagli di implementazione. Puoi anche confrontare entrambe le opzioni con il tuo codice e poi decidere.

A differenza di Rob, io vado dall'altra parte ... Dato che ho scelto di codificare contro WinAPI, utilizzo le funzioni native anziché quelle di runtime C, che comunque sono solo un sottile wrapper.

Con HeapAlloc puoi avere cumuli separati per diverse attività / sottosistemi. Ciò può semplificare l'analisi del dump di applicazioni di grandi dimensioni.

Con malloc è possibile utilizzare solo un heap, ma si ottengono alcune ottimizzazioni di allocazione che gli autori CRT potrebbero aver implementato su OS HeapAlloc.

Passare a VirtualAlloc non ti compra molto, a meno che tu non voglia implementare il gestore heap personalizzato (il tuo set di funzioni Heap *).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top