를 사용해야 하는 이유는 무엇 malloc()when"char bigchar[1u << 31-1];"잘 작동?

StackOverflow https://stackoverflow.com/questions/839291

  •  22-07-2019
  •  | 
  •  

문제

의 이점은 무엇을 사용하는 malloc(외에 NULL 을 반환에 실패)는 정적 배열?다음과 같은 프로그램을 먹을 것이지 내 모든 램을 채우기 시작 스왑 경우 루프 주석.그것이 충돌하지 않습니다.

...

#include <stdio.h>

unsigned int bigint[ 1u << 29 - 1 ];
unsigned char bigchar[ 1u << 31 - 1 ];

int main (int argc, char **argv) {
  int i;
/*   for (i = 0; i < 1u << 29 - 1; i++) bigint[i] = i; */
/*   for (i = 0; i < 1u << 31 - 1; i++) bigchar[i] = i & 0xFF; */

  getchar();
  return 0;
}

...

후에 약간의 시행 착오를 발견 위의 가장 큰 것입 정적 배열을 허용에서 32 비트 Intel 기계 GCC4.3.이 표준 한계,컴파일러한 제한 또는 기계는 제한이 있나요?분명히 내가 할 수 있습으로 많은 이들의말에서만 이용이 가능합니다.그것은 세그멘테이션이지만,경우에만 나는 요청에 대한(그리고 사용하려고)이상 malloc 을 줄 것이다.

이 있습 방법을 결정하는 경우 정적 배열이었고 실제로 할당하고 안전한 사용할 수 있나요?

편집:에 관심이 있어요 왜 malloc 관리에 사용되는 힙 시키는 대신 가상 메모리 시스템습니다.분명히 내가 할 수 있습 크기는 배열하는 여러 번 크기를 생각해야 합 및 가상 메모리 시스템의 유 램에서 필요한 것입니다.면 나는 결코 작성 예를 들어,최종(또는 처음)이러한 거대한 배열한 후 프로그램을 사용하지 않는 물리 메모리입니다.또한,내가 쓸 수 있습니다 모든 위치한 다음 무엇 malloc 지 외에 증가시키는 포인터 힙에서 검색하거나 주위의전당에서 동일한 과정이 있는가?

편집자 노트: 1 << 31 인 정의되지 않은 행동 는 경우 int 은 32 비트,그래서 변경 질문을 읽 1u.질문의 의도를 요구에 대해 할당하는 큰 정전 버퍼입니다.

도움이 되었습니까?

해결책

만,두 가지 이유가 정말:

  1. 때문에 휴대성 때문에,일부 시스템을 하지 않을 것 가상 메모리 관리습니다.

  2. 당신은 필연적으로 필요를 나누는 이열 작은 덩어리로를 위한 그것이 도움이 될 수 있도록,다음의 덩어리,그리고 결국을 시작으로"해방"의 덩어리의 배열이 더 이상 필요가 없는 너의 문제 메모리 조각화.

모두 모두에서 당신은 끝날 것이 많이 구현하는 메모리 관리 기능(실제로는 꽤 많이 재구현 malloc)의 혜택 없이 이동이 편리합니다.

따라서 이유:

  • 코드는 휴대성을 통해 메모리 관리 캡슐화 및 표준화를 실현할 것입니다.

  • 개인적인 생산성 향상 방법으로 코드의 재 사용합니다.

다른 팁

와 malloc 할 수 있는 성장하고 수축의 배열:그것은 역동적이 되도록,당신이 할당할 수 있을 정확히 무엇을 위해 당신은 필요합니다.

이라 사용자 정의 메모리 관리,나는 생각한다.당신은 할 수 있습니다,하지만 당신을 관리하는 메모리 자신입니다.당신은 바람을 쓰는 자신의 malloc()woring 이 덩어리.

에 관한:

후에 약간의 시행 착오를 발견 위의 가장 큰 것입 정적 배열 허용에서 32 비트 기계 인텔 GCC4.3.이 표준 제한 컴파일러한 제한 또는 기계 제한이 있나요?

하나는 상법에 따라 달라집 4 기가바이트(32 비트)가상 주소 공간이 분할된 사용자 공간 및 커널 공간입니다.리눅스에 대한 생각에는 가장 일반적인 분할 계획이 있 3GB 범위에 대한 주소는 사용자 공간에는 1GB 의 범위에 대한 주소는 커널 공간입니다.분할에서 구성할 수 있는 커널 구간,2 기가바이트/2GB,1GB/3GB 분할 또한 사용합니다.을 때 실행 로드,가상 주소 공간을 할당해야 하는 모든 개체에 대한 여부에 관계 없이 실시 메모리를 할당입니다.

할 수 있습을 할당하는 거대한 배열이 하나의 컨텍스트,하지만 다른 사람입니다.예를 들어,당신의 배열 구성원의 구조체고 당신이 소원을 통과하는 구조체의 주위에.어떤 환경에서는 32K 에 대한 제한 구조체의 크기입니다.

앞서 언급했듯이,크기를 조정할 수도 있습니다 메모리를 사용하여 정확하게 당신이 필요합니다.그것의 중요 성능이 중요한 상황을 되지 않는 페이징을 가상 메모리하면 그것을 피할 수 있습니다.

방법은 없을 무료로 스택 할당을 다른 보고서의 범위를 벗어납니다.그래서 당신은 실제로 사용할 때 글로벌 할당 및 VM 을 alloc 당신은 실제 하드 메모리 할당될 수 있을 때까지 귀하의 프로그램을 실행합니다.즉,프로세스 성장에 그것의 가상 메모리를 사용하여(기능은 로컬 스택 할당 및 그 될 것입니다"해방").

할 수 없습니다"계속"스택 메모리면 그것은 범위를 벗어의 기능,그것은 항상 해제됩니다.알고 있어야 합니다 그래서 얼마나 많은 메모리를 사용할 c 컴파일러입니다..

다음으로 귀결 얼마나 많은 int foo[1<<29]'s 할 수 있습니다.이후 첫 번째는 전체 메모리(에서 32 비트)및 될 것입니다(수 있습니 거짓말:0x000000)두 번째 해결하 0xffffffff 또는 thereaobout.그는 세 번째 중 하나는 것이 해결이 무엇입니까?는 무언가를 32 비트 포인터에 표현할 수가 없습니다.(을 기억하는 스택 예약하실 수 있 해결 부분에서 compiletime,부분적으로 런타임을 통해,오프셋,얼마나 멀리 스택 오프셋이 밀려할 때 alloc 이 또는 변수).

그래서 대답을 거는 한이 있 int foo[1<<29]당신이 모든 합리적인 깊이의 기구하는 요금 및 보증금은 다음과 같 스택은 변수가 더 이상입니다.

당신이 정말 피해야 하는 이것이 무엇인지 알지 못한다면 당신은 하고 있다.하려고만 요청으로 많은 메모리를 할 수 있습니다.는 경우에도 사용하지 않는 방식으로 점점 다른 프로그램의 망칠 수 있습니다 프로세스 자체입니다.거기에는 두 가지 이유가 있습니다.첫째,특정 시스템에서,특히 32bit 사람을 일으킬 수 있 주소 공간을 조기에 소진에 극히 드문 상황.또한 많은 알갱이 어떤 종류의 프로세스별로 제한 소유권을 보유하고 있/가상/지에서 사용하는 메모리.프로그램이 요청한 메모리에서 실행 시간 커널을 죽일 수 있는 경우 프로세스에 대해 묻는 메모리를 예약할 수 초과하는 이 제한.본 프로그램 중 하나가 추락하거나 종료한 실패로 인해 malloc 기 때문에 그들은 예약 GBs 의 메모리하는 동안에만 사용하여 몇 MB 입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top