2013-04-15 10 views
5

Qualcuno sarebbe così gentile da tradurre questa frase per qualcuno che ignora beatamente il codice non gestito e le complessità della gestione della memoria?Il buffer viene allocato da un heap condiviso per il processo con dimensioni di 64 KB?

La memoria per questo buffer è allocata da un heap condiviso per il processo con dimensione di 64 KB. La dimensione massima del buffer dipenderà dall'utilizzo dell'heap.

È presente in alcune dozzine di pagine MSDN, ad es. WriteConsole, ma non riesco a trovare alcuna API che calcoli la dimensione massima che tale array può essere prima di esplodere, empiricamente posso dire che è da qualche parte tra 61 e 62,5 KB (chiamando 64, 63, 62 ecc. Finché non smette di impostare DllImport 's SetLastError). C'è qualcosa come GetTotalHeapSize (se non è un const 64KB indipendente dalla versione di Windows, l'architettura della piattaforma, i valori predefiniti, ecc.) E qualcosa come GetCurrentHeapInUse disponibile? Come si possono ottenere i byte massimi che posso passare a quello e ad altri metodi P/Invocati?

+0

Ecco un sospetto. È molto probabile che l'heap si trovi su un limite di 64 km. In tal caso, chiama 'myptr = malloc (1)' e controlla il valore di 'myptr & 0xFFFF'. Sarà molto vicino alla quantità di spazio utilizzato - l'importo rimasto sarà di circa 64k meno quel numero. – Floris

risposta

4

Non è così che funzionano gli heap. Non tengono traccia della più grande allocazione che puoi fare. È imprevedibile perché un heap può essere frammentato. I blocchi liberi possono essere intercalati con quelli assegnati. Rilasciando una singola piccola allocazione potrebbe improvvisamente raddoppiare lo spazio disponibile, ad esempio. Gli heap non gestiti non hanno il lusso di un heap gestito, non possono essere compattati. Anche se il .NET Large Object Heap ha questo problema. Non c'è alcuna funzione per misurare il più grande spazio disponibile, è impossibile renderlo thread-safe.

Nulla che puoi fare, ma prova per assegnare e gestire le conseguenze se non puoi.

+1

Grazie, trovo strano che ci siano una dozzina di API pubbliche che richiedono parametri di array di lunghezza sconosciuta, o meno di 64kb-ma-not-sure-how-much-less per essere specifici. Sono corretto supponendo che l'evento sebbene l'array 61kb funzioni sulla mia macchina se ho hardcode 60kb non è ancora garantito il funzionamento su altri dispositivi/piattaforme? E le funzioni [HeapQueryInformation] (http://msdn.microsoft.com/library/aa366703.aspx) e [HeapSize] (http://msdn.microsoft.com/library/aa366706.aspx) sembrano utili ma non aiutano per ottenere quel magico numero esatto di byte? –

+1

Questo heap è insolito. È un dettaglio di implementazione per console e non è affatto esposto. L'unica ragione per cui ne hai sentito parlare è perché è così piccola che Microsoft ha dovuto dire qualcosa a riguardo per spiegare gli errori comuni. L'API della console è eccentrica in questo modo. Nonostante sia un problema risolto, questa restrizione esiste solo nelle versioni precedenti di Windows. La cosa sana da fare è semplicemente non cercare di spingere al limite. WriteConsole funzionerà altrettanto bene con buffer di piccole dimensioni. –

+0

Cosa intendi con 'risolto comunque'? Ecco uno snippet gestito che esplora con lo stesso 'Memoria insufficiente disponibile sull'ultimo sistema operativo/hardware ... ' Console.WindowHeight = 100; Console.BufferWidth = 1000; Console.MoveBufferArea (0, 0, Console.BufferWidth, 16, 0, 0); ' –

Problemi correlati