Быстрый успешный выход из C ++ с большим количеством объектов - PullRequest
5 голосов
/ 22 января 2011

Я ищу способ быстро выйти из C ++, который выделил много структур в памяти, используя классы C ++.Программа завершается корректно, но после последнего «возврата» в программе все авто-деструкторы запускаются. Проблема в том, что программа выделила около 15 ГБ памяти через множество структур классов C ++, и этот процесс авто-деструктуры занимаетСам еще около 1 часа, чтобы пройти через все структуры - хотя мне плевать на результаты.До этого момента программе потребовалось всего 1 час.Я хотел бы просто вернуться к ОС и позволить ей сделать обычное массовое удаление распределения процессов - что очень быстро.Я делал это вручную, убивая процесс на этапе очистки - но я ищу лучшее программное решение.

Я хотел бы вернуть успех ОС, но не хочу, чтобы какой-либосодержимого памяти.Программа выполняет много динамического выделения / освобождения во время обычной обработки, так что это не просто управление кучей.

Есть какие-нибудь мнения?

Ответы [ 6 ]

4 голосов
/ 22 января 2011

В Стандартном C ++ у вас есть только abort (), но при этом процесс возвращает ошибку ОС.

На многих платформах (Unix, MS Windows) вы можете использовать _exit () для выхода из программы без очистки и деструкторов.

2 голосов
/ 22 января 2011

C ++ 0x std :: quick_exit - это то, что вы ищете, если ваш компилятор уже поддерживает его (g ++ - 4.4.5 делает).

1 голос
/ 22 января 2011

Возможные стратегии зависят от количества объектов, которые непосредственно видны в main, через которые вы получаете доступ к 15 ГБ данных, и от того, являются ли они локальными по отношению к основному или статически распределенными.

Если все доступ к 15 ГБ данных осуществляется через локальные объекты в main, тогда вы можете просто заменить return 0; в конце main на exit(0);.
exit прекратит работу вашего приложения ивызвать очистку статически размещенных переменных, но , а не локальных переменных.

Если доступ к данным осуществляется через несколько статически размещенных переменных, вы можете превратить их в указатели (или ссылки) для динамическоговыделил память и намеренно утек это.

1 голос
/ 22 января 2011

Если у вас есть компилятор C99, вы можете использовать функцию _Exit для немедленного завершения без необходимости вызывать деструкторы глобального объекта или любые функции, зарегистрированные с atexit; сбрасываются ли незаписанные данные буферизованного файла, закрываются открытые потоки или удаляются временные файлы, определяется реализацией (C99 §7.20.4.4).

Если вы работаете в Windows, вы также можете использовать ExitProcess для достижения того же эффекта.

Но, как говорили другие, вашим деструкторам на самом деле не нужно тратить час на запуск, если вы не выполняете достаточное количество операций ввода-вывода (записи файлов журнала и т. Д.). Я настоятельно рекомендую вам профилировать свою программу, чтобы узнать, на что тратится время.

1 голос
/ 22 января 2011

Как говорит Навин, это не может быть вопросом освобождения памяти.Я написал имитацию нейронной сети с помощью эволюционных алгоритмов, в которых выделение и освобождение большого количества памяти маленькими и большими частями, и это никогда не было главной проблемой.

1 голос
/ 22 января 2011

Если 15 ГБ памяти выделено относительно небольшому количеству классов, вы можете переопределить оператор удаления для этих классов.Просто передайте вызов стандартному удалению, но установите глобальный флаг, который, если установлен, будет вызывать удаление без операции.Или, если логика вашей программы такова, что эти объекты не удаляются в ходе обычного построения структур данных, вы можете просто игнорировать удаление во всех случаях для этих классов.

...