2011-01-31 5 views
2

매우 큰 배열을 만들어야합니다. 50 메가 바이트라고합시다.힙에 정적 배열을 만드시겠습니까?

일반 정적 배열로 안전하게 만들 수 있습니까? 컴파일러가 스택에 스택을 넣을 수 있습니까 (스택 오버플로가 발생할 수 있음) 또는 스택을 힙에 넣을만큼 똑똑할까요?

그렇게 할 방법이 없다면 프로그램 시작시 malloc 또는 "new"로 쉽게 할 수 있지만 프로그램이 끝나면 자동으로 해제 할 수 있습니까?

+4

정적 키워드 또는 '동적이 아니요'와 같이 '정적'을 의미합니까? – James

+0

키워드에서와 같이 정적입니다. 나는 이것이 또한 역동적이지 않다는 것을 의미한다고 생각한다! – Pubby

답변

3

제가 알고 있듯이 정적 변수는 스택에 존재하지 않습니다. 만약 그렇다면, 그들이 살고있는 스택 프레임을 터뜨릴 때 어디로 갈 것인가? 정적 함수 변수는 호출간에 상태를 유지해야하므로 논리적으로 정적 데이터는 힙에 보관해야합니다.

또한 프로그램이 끝나면 모두이 자동으로 할당 해제됩니다.

+0

아, 그럼 그들이 스택에 없을 것 같아요. – Pubby

+0

모든 것은 자동으로 힙이 아닌 스택에서 할당이 해제됩니다. –

+0

둘 다 프로세스에 할당 된 메모리 내에 있지 않습니까? 프로그램이 끝나면 OS로 다시 릴리스됩니다. – Twisol

2

이 작업을 수행하는 쉬운 방법은 ::

std::vector data; 
data.reserve(<Number of Elements); 

또는 잠재적으로 표준 : 양단 큐 (사용량에 따라) 벡터

를 표준을 사용하는 것입니다.

컴파일러가 스택에 스택 오버플로를 일으킬 수 있습니까? 아니면 힙에 넣을만큼 똑똑할까요?

스택 오버플로는 이론적 스택과 이론적 힙이 충돌하여 혼합 될 때 발생합니다. 스택이 너무 많아지면 힙 또한 실패 할 것입니다.

일부 시스템은 스택 프레임의 최대 크기를 가지고 있습니다 (이것은 컴파일러 및 플랫폼에 따라 다릅니다). 자세한 내용은 컴파일러 설명서를 참조하십시오. 결과적으로 대용량 구조를 동적으로 할당하는 것이 좋습니다 (직접적으로는 아니지만).

std :: vector는 이것을 수행합니다 (아마도). 작은 로컬 객체가 있지만 주요 페이로드 (일반적으로)는 동적 힙 할당으로 구현됩니다.

+0

std :: vector를 사용하고 싶지 않습니다. 나는 소멸자를 이용하여 클래스에서 랩핑 할 수 있다고 생각합니다. – Pubby

+1

@ 페페 : 왜 안 되니? –

+3

배열에 대해 물었 기 때문에. – Pubby

0

50 메가 바이트는 현재 표준으로는 지나치게 많지 않습니다.

C++ new 연산자를 사용하여 프로그램 시작시에 할당 할 수 있으며 끝 부분 (또는 정의 된 프로그램 섹션의 시작/끝)에 delete []를 사용하여 할당을 해제 할 수 있습니다.

이 배열이로드 될 파일을 나타내는 경우 파일을 메모리에로드 할 때이 배열을 할당하는 것이 좋습니다. 최적의 방법으로 파일의 일부분 만 메모리에 매핑 할 수 있습니다 (예 : 1MB, 2MB 또는 사용하려는 다른 논리 단위) (Windows의 MapViewOfFile 및 UNIX 시스템의 mmap 참조). 이렇게하면 가상 메모리를 모두 소모하지 않고 매우 큰 파일을로드 할 수 있습니다.

+0

수동으로'new' 및'delete'를 호출하면 Leakapalooza에 대한 티켓입니다. – fredoverflow

+1

내가 leakapalooza에 티켓을 원하지 않으면 나는 아기 자바에 코드를 작성하고있을 것이다! – Pubby

+0

@FredOverflow : .NET 또는 Java에서 C++ 2) 프로그램이 필요한 경우 리소스 (RIAA)를 신중하게 추적 할 수 있습니다. –

1

정적으로 할당하면 정적으로 할당됩니다. 전형적인 경우에는 실행 파일에 특정 변수가 0으로 초기화 된 크기 N 블록이되도록 지정하는 일종의 레코드가 있습니다. 로더는 일반적으로 프로그램 코드에 대한 공간을 할당하는 것처럼 그것을 존중합니다. 예를 들어 주소 공간을 할당하지만 실제로는 해당 메모리를 읽거나 쓰지 않는 한 이 아닌 실제 메모리가 있습니다.

2

내 경험상 힙에 큰 어레이를 할당하는 것이 더 낫습니다. (따라서 새로운 것을 통해) - 스택에 2MB를 할당 한 후 유닉스 시스템에 프로그램 코어 덤프를 보았습니다. 자동 삭제를 원할 경우 스마트 포인터 (예 : boost :: scoped_array)를 사용할 수 있습니다. 그러나 "프로그램이 끝나면 자동으로 삭제하기"라는 말 때문에 아무 것도 할 필요가 없습니다. 운영 체제가 종료 될 때 운영 체제가 모든 프로세스의 메모리를 회수합니다.

어쨌든 은 원시 배열 대신 std :: vector를 사용해야합니다.

관련 문제