2010-04-22 23 views
5

Ho il seguente pezzo di frammento diL'allocazione dello stack ha esito negativo e l'allocazione dell'heap ha esito positivo !! È possibile?

Class Sample 
{ Obj_Class1 o1; 
    Obj_Class2 o2;}; 

Ma le dimensioni di Obj_Class1 e Obj_Class2 è enorme in modo che il compilatore mostra un avvertimento "prevedere il passaggio po 'di spazio al cumulo". Mi è stato chiesto di sostituire Obj_Class1 o1 con Obj_Class1* o1 = new Obj_Class1();, ma ritengo che non sia necessario apportare questa modifica poiché l'allocazione dell'heap fallirà anche se l'allocazione dello stack non riesce. Ho ragione? O ha senso fare questo cambiamento (oltre a sopprimere l'avviso del compilatore).

+0

Solo per curiosità, qual è la dimensione delle classi? – Naveen

+0

circa 65000 byte ... – Prabhu

+0

Inoltre, invece di sostituire l'istanza Obj_Class1 con un puntatore, è invece possibile modificare la sua implementazione per allocare le proprie esigenze nell'heap? Anche cambiarlo in un Pimpl potrebbe aiutare questo. –

risposta

5

È molto tipico che lo stack sia più piccolo dell'heap. Usano diverse posizioni di memoria. Lo stack ha in genere dimensioni di un megabyte (è possibile modificarlo, ma attenzione) e viene assegnato per thread. L'heap può consumare gigabyte se necessario.

+0

Ma stack e heap crescono uno contro l'altro. Non loro? – Prabhu

+0

@Prabhu: Sì, ma la dimensione massima dello stack è ancora limitata a smth come 1 megabyte. – sharptooth

+0

@Prabhu: No, non lo fanno. Questo è un buon modello di spiegazione per una lezione di informatica, ma in realtà non c'è nulla che costringa quel modello a essere quello effettivamente usato. –

3

Lo stack di solito è piccolo e non adatto a contenere oggetti enormi, mentre l'heap è separato e progettato per loro.

Nel vostro campione, probabilmente si dovrebbe destinare l'intero Sample sul mucchio, non i suoi membri:

int main() { 
    Sample* sample = new Sample(); 
} 
2

In caso di Visual Studio, ogni thread di default si ha 1 MB di spazio, e se si tenta di allocare più di quello che si otterrà un errore di overflow dello stack. Heap non ha questa restrizione e la quantità di memoria che è possibile allocare dipende dallo spazio continuo più grande disponibile nella memoria virtuale del processo. Quindi non è molto sorprendente che l'allocazione dello stack fallisca nel caso in cui gli oggetti siano davvero enormi.

+0

Nitpick: l'overflow dello stack non si verifica quando si assegna più della dimensione dello stack, ma piuttosto quando si allocano più le dimensioni dello stack disponibili. Voglio dire che funzionerà o meno in base alla quantità di stack già utilizzata. – sharptooth

3

Stack è piuttosto piccola per impostazione predefinita: http://msdn.microsoft.com/en-us/library/ms686774(VS.85).aspx

La dimensione predefinita per la memoria di stack riservato e inizialmente impegnata è specificato nell'intestazione del file eseguibile. La creazione di thread o fibra fallisce se non c'è abbastanza memoria per riservare o impegnare il numero di byte richiesti. La dimensione di prenotazione stack predefinita utilizzata dal linker è 1 MB. Per specificare una diversa dimensione di riserva dello stack predefinito per tutti i thread e le fibre, utilizzare l'istruzione STACKSIZE nel file di definizione del modulo (.def). Il sistema operativo arrotonda la dimensione specificata al multiplo più vicino della granularità di allocazione del sistema (in genere 64 KB). Per recuperare la granularità di allocazione del sistema corrente, utilizzare la funzione GetSystemInfo.

Problemi correlati