2011-01-22 3 views
5

C++ 클래스를 사용하여 메모리에 많은 구조체를 할당 한 C++을 빠르게 종료 할 수있는 방법을 찾고 있습니다. 프로그램은 올바르게 끝났지 만 프로그램의 마지막 "반환"이후에 모든 자동 소멸자가 시작됩니다. 문제는 프로그램이 많은 C++ 클래스 구조를 통해 약 15GB의 메모리를 할당했고이 자동 소멸 프로세스가 결과에 대해 신경 쓰지 않아도 모든 구조물을 통과하면서 완성되는 데 약 1 시간이 더 걸립니다. 이 프로그램은이 시점까지 작업을 완료하는 데 1 시간 밖에 걸리지 않았습니다. OS로 돌아가서 일반적인 도매 프로세스 할당 삭제를 수행하고 싶습니다. 이는 매우 빠릅니다. 나는 클린업 단계에서 프로세스를 수동으로 종료하여이 작업을 수행했지만 더 나은 프로그래밍 솔루션을 찾고 있습니다.많은 양의 객체가 할당 된 C++에서 빠 르게 벗어났습니다.

OS에 성공을 돌려주고 싶지만 메모리 내용을 유지하는 데 신경 쓰지 마십시오. 이 프로그램은 일반적인 처리 중에 많은 동적 할당/할당 해제를 수행하므로 단순한 힙 관리가 아닙니다.

의견이 있으십니까?

+6

소멸자에서 아무 것도하지 않으면 1 시간 정도 걸릴 수 없습니다. 그것을 막고있는 것이 있어야합니다. 프로파일 링을 시도 했습니까? – Naveen

답변

1

비교적 적은 수의 클래스에 15GB의 메모리가 할당되는 경우 해당 클래스의 연산자 삭제를 무시할 수 있습니다. 호출을 표준 삭제에 전달하기 만하면 글로벌 플래그를 설정합니다.이 플래그가 설정되면 no-op를 삭제하도록 호출합니다. 또는 프로그램의 논리가 이러한 오브젝트가 데이터 구조를 빌드하는 정상적인 과정에서 삭제되지 않도록하는 경우 이러한 클래스에 대한 모든 경우에 삭제를 무시할 수 있습니다.

1

Naveen이 말했듯이 이것은 메모리 할당 해제 문제가 될 수 없습니다. 저는 크고 작은 덩어리로 많은 메모리를 할당하고 해제하는 진화 알고리즘으로 신경망 시뮬레이션을 작성했습니다. 이것은 중요한 문제가 아닙니다.

4

표준 C++에서는 abort() 만 있지만 프로세스 반환 오류가 있습니다.

많은 플랫폼 (Unix, MS Windows)에서 _exit()을 사용하여 정리 및 소멸자를 실행하지 않고 프로그램을 종료 할 수 있습니다.

+0

_exit()은 POSIX 함수이므로 (소멸자에 대해서는 아무 것도 말하지 않습니다. C++에 대해서는 아무 것도 말하지 않습니다). 현재 그것은 플랫폼에 소멸자를 호출하지 않지만 문서에 의해 보장되지는 않습니다. –

+0

이것이 내가 특정 플랫폼에서 작동한다고 말한 이유입니다. 그러나 http://stackoverflow.com/q/4769229/585729에서 논의 된 바와 같이 그것이 존재하는 플랫폼의 경우가되어야합니다. – JoergB

1

C99 컴파일러를 사용하는 경우 _Exit 함수를 사용하여 전역 개체 소멸자 또는 atexit으로 등록 된 함수를 호출하지 않고 즉시 종료 할 수 있습니다. 쓰기되지 않은 버퍼 된 파일 데이터가 플러시되었는지, 열린 스트림이 닫혀 있는지 또는 임시 파일이 제거되는지는 구현 정의됩니다 (C99 §7.20.4.4).

Windows를 사용하는 경우 ExitProcess을 사용해도 동일한 효과를 얻을 수 있습니다.

하지만 다른 사람들이 말한 것처럼 소멸자는 상당한 양의 I/O (로그 파일 작성 등)를하지 않으면 실제로 실행하는 데 1 시간이 걸리지 않아야합니다. 시간 낭비를보기 위해 프로그램의 프로필을 강력하게 강력히 권합니다.

1

가능한 전략은 main에서 직접 볼 수있는 개체의 수에 따라 달라지며 15GB의 데이터에 액세스하고 기본 또는 정적으로 할당 된 로컬 인 경우 사용할 수 있습니다. 데이터의 15기가바이트에 모든 액세스 main에서 로컬 객체를 통해 경우

, 당신은 단순히 exit(0);main의 끝에서 return 0;를 교체 할 수 있습니다.
exit은 응용 프로그램을 종료하고 정적으로 할당 된 변수의 정리를 트리거하지만 은 로컬 변수가 아닌입니다.

정적으로 할당 된 몇 가지 변수를 통해 데이터에 액세스하는 경우 동적으로 할당 된 메모리에 대한 포인터 (또는 참조)로 변경하여 고의로 누출시킬 수 있습니다.

2

컴파일러가 이미 지원하는 경우 (g ++ - 4.4.5는) 찾고있는 것이 C++ 0x std::quick_exit입니다.