2011-01-22 8 views
5

Sto cercando un modo per uscire rapidamente da un C++ che ha allocato molte strutture in memoria utilizzando le classi C++. Il programma termina correttamente, ma dopo il "ritorno" finale nel programma, tutti gli auto-distruttori entrano in gioco. Il problema è che il programma ha allocato circa 15 GB di memoria attraverso molte strutture di classe C++, e questo processo di auto-distruzione richiede circa 1 ora in più da completare mentre cammina attraverso tutte le strutture - anche se non mi interessa i risultati. Il programma ha impiegato solo 1 ora per completare l'attività fino a questo punto. Vorrei solo tornare al sistema operativo e lasciare che faccia la sua normale cancellazione di allocazione dei processi all'ingrosso - che è molto veloce. Lo sto facendo manualmente abbattendo il processo durante la fase di pulizia, ma sto cercando una soluzione migliore.Uscita rapida riuscita da C++ con molti oggetti allocati

Mi piacerebbe restituire un successo al sistema operativo, ma non si cura di mantenere alcun contenuto di memoria. Il programma esegue molta allocazione/deallocazione dinamica durante la normale elaborazione, quindi non è solo una semplice gestione dell'heap.

Qualche opinione?

+6

Non ci vuole un'ora se non si sta facendo nulla in distruttore. Deve esserci qualcosa che lo sta bloccando. Hai provato a delinearlo? – Naveen

risposta

1

Se i 15 GB di memoria vengono allocati a un numero ragionevolmente piccolo di classi, è possibile eseguire l'override dell'eliminazione dell'operatore per tali classi. Basta passare la chiamata all'eliminazione standard, ma impostare un flag globale che, se impostato, effettuerà la chiamata per eliminare un no-op. Oppure, se la logica del tuo programma è tale che questi oggetti non vengono cancellati nel normale corso della costruzione delle tue strutture dati, puoi semplicemente ignorare l'eliminazione in tutti i casi per queste classi.

1

Come dice Naveen, questo non può essere un problema di deallocazione della memoria. Ho scritto simulazioni di reti neurali con algoritmi evolutivi che allocavano e liberano molta memoria in pezzi piccoli e grandi e questo non è mai stato un grosso problema.

4

In Standard C++ si ha solo abort(), ma questo ha l'errore di ritorno del processo al sistema operativo.

Su molte piattaforme (Unix, MS Windows) è possibile utilizzare _exit() per uscire dal programma senza eseguire cleanup e distruttori.

+0

_exit() non dice nulla sui distruttori poiché è la funzione POSIX (che non dice nulla di C++). Attualmente non chiama alcun distruttore sulla piattaforma che ho, ma non è garantito dalla documentazione. –

+0

Ecco perché ho detto che questo funziona su piattaforme specifiche. Ma come discusso su http://stackoverflow.com/q/4769229/585729 dovrebbe essere il caso su qualsiasi piattaforma in cui esiste. – JoergB

1

Se si dispone di un compilatore C99, è possibile utilizzare la funzione _Exit di porre fine immediatamente senza dover distruttori di oggetti globali o eventuali funzioni registrate con atexit da chiamare; indipendentemente dal fatto che i dati del file buffer non scritto vengano svuotati, che i flussi aperti siano chiusi o che i file temporanei vengano rimossi è definito dall'implementazione (C99 §7.20.4.4).

Se sei su Windows, puoi anche utilizzare ExitProcess per ottenere lo stesso effetto.

Ma, come altri hanno già detto, i tuoi distruttori non dovrebbero impiegare un'ora per essere eseguiti a meno che non si esegua una buona quantità di I/O (scrittura di file di registro, ecc.). Ti consiglio vivamente di profilare il tuo programma per vedere dove viene speso il tempo.

1

Le possibili strategie dipendono dal numero di oggetti che sono direttamente visibili in main tramite cui si accede ai 15 GB di dati e se questi sono locali a principale o allocati staticamente.

Se tutto accesso ai 15 GB di dati è attraverso oggetti locali in main, allora si può semplicemente sostituire il return 0; alla fine del main con exit(0);.
exit interromperà l'applicazione e attiverà la pulizia delle variabili allocate staticamente, ma non di variabili locali.

Se si accede ai dati tramite una manciata di variabili allocate staticamente, è possibile trasformarle in puntatori (o riferimenti) in memoria allocata dinamicamente e filtrare deliberatamente.

2

C++ 0x std::quick_exit è ciò che stai cercando se il tuo compilatore lo supporta già (g ++ - 4.4.5 fa).

Problemi correlati