Funzioni globali e locali

Le funzioni globali e locali sono supportate per la conversione da codice a 16 bit o per mantenere la compatibilità del codice sorgente con Windows a 16 bit. A partire da Windows a 32 bit, le funzioni globali e locali vengono implementate come funzioni wrapper che chiamano le funzioni heap corrispondenti usando un handle per l'heap predefinito del processo. Pertanto, le funzioni globali e locali hanno un sovraccarico maggiore rispetto ad altre funzioni di gestione della memoria.

Le funzioni heap forniscono più funzionalità e controllo rispetto alle funzioni globali e locali. Le nuove applicazioni devono usare le funzioni heap, a meno che la documentazione non indichi in modo specifico che deve essere usata una funzione globale o locale. Ad esempio, alcune funzioni di Windows allocano memoria che devono essere liberate con LocalFree e le funzioni globali vengono ancora usate con Dynamic Data Exchange (DDE), le funzioni degli Appunti e gli oggetti dati OLE. Per un elenco completo di funzioni globali e locali, vedere la tabella in Funzioni di gestione della memoria.

La gestione della memoria di Windows non fornisce un heap locale separato e un heap globale, come windows a 16 bit. Di conseguenza, le famiglie globali e locali di funzioni sono equivalenti e la scelta tra di essi è una questione di preferenza personale. Si noti che la modifica da un modello di memoria segmentata a 16 bit a un modello di memoria virtuale a 32 bit ha reso alcune delle funzioni globali e locali correlate e le relative opzioni non necessarie o senza significato. Ad esempio, non sono più presenti puntatori vicini e lontani, perché le allocazioni locali e globali restituiscono indirizzi virtuali a 32 bit.

Gli oggetti di memoria allocati da GlobalAlloc e LocalAlloc sono in pagine private e di commit con accesso in lettura/scrittura a cui non è possibile accedere da altri processi. La memoria allocata tramite GlobalAlloc con GMEM_DDESHARE non è effettivamente condivisa a livello globale perché è in Windows a 16 bit. Questo valore non ha alcun effetto ed è disponibile solo per la compatibilità. Le applicazioni che richiedono memoria condivisa per altri scopi devono usare oggetti di mapping file. Più processi possono eseguire il mapping di una visualizzazione dello stesso oggetto di mapping file per fornire memoria condivisa denominata. Per altre informazioni, vedere Mapping dei file.

Le allocazioni di memoria sono limitate solo dalla memoria fisica disponibile, inclusa l'archiviazione nel file di paging su disco. Quando si alloca memoria fissa, GlobalAlloc e LocalAlloc restituiscono un puntatore che il processo chiamante può usare immediatamente per accedere alla memoria. Quando si alloca memoria spostabile, il valore restituito è un handle. Per ottenere un puntatore a un oggetto memoria rimovibile, usare le funzioni GlobalLock e LocalLock .

Le dimensioni effettive dell'allocazione della memoria possono essere maggiori delle dimensioni richieste. Per determinare il numero effettivo di byte allocati, usare la funzione GlobalSize o LocalSize . Se l'importo allocato è maggiore dell'importo richiesto, il processo può usare l'intero importo.

Le funzioni GlobalReAlloc e LocalReAlloc modificano le dimensioni o gli attributi di un oggetto di memoria allocato da GlobalAlloc e LocalAlloc. Le dimensioni possono aumentare o diminuire.

Le funzioni GlobalFree e LocalFree rilasciano la memoria allocata da GlobalAlloc, LocalAlloc, GlobalReAlloc o LocalReAlloc. Per eliminare l'oggetto di memoria specificato senza invalidare l'handle, usare la funzione GlobalDiscard o LocalDiscard . L'handle può essere usato in un secondo momento da GlobalReAlloc o LocalReAlloc per allocare un nuovo blocco di memoria associato allo stesso handle.

Per restituire informazioni su un oggetto di memoria specificato, usare la funzione GlobalFlags o LocalFlags. Le informazioni includono il conteggio dei blocchi dell'oggetto e indica se l'oggetto è eliminabile o è già stato rimosso. Per restituire un handle all'oggetto memoria associato a un puntatore specificato, usare la funzione GlobalHandle o LocalHandle.

Confronto dei metodi di allocazione della memoria