2012-02-23 2 views
1

큰 문자 배열을 선언하려고합니다. 문자 배열을 비트 맵으로 사용하고 있습니다 (부울지도의 경우 이 아닌 이미지 파일 유형). 다음 코드는 컴파일 오류를 생성합니다.C++에서 큰 문자 배열 선언

//This is code before main. I want these as globals. 
unsigned const long bitmap_size = (ULONG_MAX/(sizeof(char))); 
char bitmap[bitmap_size]; 

오류가 배열 차원의 플로우이다. 나는 내 프로세스가 많은 양의 데이터를 소비하도록 노력하고 있으며 그렇게하지 못하게하는 한계가있을 수 있음을 알고 있습니다. 문법 오류를 만들고 있는지 또는 커널에서 더 많은 자원을 요청해야하는지 궁금합니다. 또한 일부 클래스를 사용하여 비트 맵을 만드는 데 관심이 없습니다. 시간 내 주셔서 감사합니다.

EDIT ULONG_MAX는 사용중인 컴퓨터에 크게 의존합니다. 내 코드를 컴파일하고있는 특정 컴퓨터에서 42 억을 훨씬 넘었습니다. 전체적으로 적어도 메모리 할당을 위해 상수와 같은 상수를 사용하지 않을 것입니다.

+2

그냥 'sizeof (char)'는 항상 1이므로 분단은 무의미합니다. –

+4

32 비트 컴퓨터에서 4 기가 바이트의 메모리를 할당하려고한다는 것을 알고 있습니까? – fazo

+0

결과 4 기가 바이트 메모리 – triclosan

답변

4

ULONG_MAX/sizeof(char)은 매우 큰 숫자 인 ULONG_MAX과 동일합니다. 실제 크기가 너무 커서 가상 메모리에도 공간이 없습니다 (왜냐하면 ULONG_MAX은 아마도 전체 가상 메모리의 바이트 수이기 때문입니다).

당신이하고자하는 일을 반드시 재고해야합니다.

+0

감사합니다. 나는 ULONG_MAX를 바이트 수가 아닌 char의 비트 수로 나누는 것을 의미했습니다. 컴파일러는 더 이상이 후에 불평하지 않습니다. – order

0

제가 알기에, C++의 배열의 최대 크기는 플랫폼이 지원하는 가장 큰 정수입니다. 긴 형식의 bitmap_size 상수가 해당 제한을 초과 할 수 있습니다.

4

32 비트 시스템에서 배열이 4GB이고 사용 가능한 주소 공간에 맞지 않는 대부분의 시스템에서 배열을 선언 할 수는 없으며 대부분의 64 비트 시스템에서는 16 엑사 바이트 (1,600 만 테라 바이트)로, 거기에 사용할 수있는 주소 공간에 맞지 않습니다 (또한, 전체 행성보다 더 많은 메모리가있을 수 있습니다).

많은 양의 메모리를 할당하려면 malloc()을 사용하십시오. 그러나 현실적이어야합니다. :)