2011-04-28 12 views
4

필자는 포인터가 필요한 경우 메모리를 동적으로 할당 할 수 있도록 포인터를 사용할 수 있다는 점을 이해합니다. 어레이를 미리 정적으로 할당합니다.포인터를 통해 배열을 사용하는 경우 또는 그 반대로 사용하는 경우

동적 할당의 계산 시간을 절약하고 더 큰 메모리 풋 프린트를 사용하는 것보다 더 큰 메모리 풋 프린트를 사용하고 필요한 메모리 만 할당하기 위해 계산 시간을 사용하는 것이 더 좋은 시점을 결정하는 데 어려움이 있습니다.

누군가이 주제에 대해 조금 비추어 줄 수 있습니까? 도움이 될만한 일반적인 규칙이 있습니까?

답변

1

당신은 동적으로 할당 사용해야 메모리 :

  • 당신이 컴파일시
  • 메모리의 양을에서 필요로하는 방법 메모리를 많이 모르는이 실행 달라 때
  • 당신은 많은 양을 필요로 메모리의

당신은 정적으로 할당 사용해야 메모리 때

  • 당신이 시간을
  • 필요한 메모리의 양을 컴파일의 크기를 알고하면 운영 체제에 뭔가를 물어 프로그래밍 할 때입니다, 동적으로 할당 된 메모리 호출 시스템의 사용을 필요로 사용

낮다. 프로세스가 다른 프로세스에 제공되는 "처리 시간"을 느슨하게 할 가능성이 있으므로 속도 위반이 있습니다. OS가 호출을 수행하기 위해 수행해야하는 많은 작업이 있습니다. 메모리를 요청하기위한 시스템 호출을하는 것은 프로세스 스택에 저장된 배열에 쓰는 것보다 훨씬 무거운 프로세스입니다.

+0

"필요한 메모리 양이 적습니다"에서 "낮음"을 정의하는 좋은 방법이 있습니까? 나는이 문턱이 어디에 있는지 잘 모른다. – Mark

+0

이 질문은 내가 묻기를 시도한 질문의 핵심에 실제로 도달합니다 (그러나 잘못했을 수도 있음). 그러나, 나는 여전히 낮은 메모리 임계 값을 고려해야 할 것에 관심이 있습니다. – Mark

+0

@Mark : 스택에는 제한이 있습니다. 필요한 모든 메모리를 "저장할"수 있으면 "부족"할 수 있습니다. 그러나 모든 함수는 스택을 사용하므로 많은 함수가 메모리를 사용하면 스택 오버플로에서 실행할 수 있습니다. 때로는 동적 메모리를 사용하는 것이 더 안전합니다. 이것은 모두 프로그램이 필요로하는 메모리의 양과 OS가 작동 중인지에 달려 있습니다. 크거나 작은 것에 대한 규칙은 없습니다. – anizzomc

0

데이터가 동적이거나 프로그램의 다른 영역에서 데이터를 전달해야 할 때 동적 컨테이너를 사용합니다.

1 - 동적 데이터 이웃에 대한 목록이 있다고 가정 해보십시오. 그들은 거리에 새로운 집을 짓고 목록에 남자를 추가해야하지만 15 명의 이웃에게 충분한 공간 만 할당했습니다. 이 동적 메모리를 사용하면 해당 컨테이너의 크기를 늘릴 수 있습니다. 그것이 실제로 어떻게 작동하는지는 아닙니다. 사실, 그것은 필요한 크기의 새로운 메모리 덩어리를 발견하고 오래된 컨테이너를 복사합니다.

또는 다른 예. 주소록을 추적하는 프로그램을 작성한다고 가정 해보십시오. 사용자 중 한 명이 10 개의 연락처를 가지고 있습니다. 다른 사용자는 법인이며이 주소록에 5 만 명의 직원이 모두 저장되어 있어야합니다. 연락처가 10 개인 사용자에게 50000 개의 공간을 할당하지 않으므로 필요한만큼 정확하게 할당합니다.

2 - 데이터 전달 정적 데이터를 할당하면 스택에 배치 된 다음 범위를 벗어난 후 액세스 할 수 없습니다. 따라서 배열을 생성하는 함수를 호출 한 다음 배열의 메모리 주소를 호출자에게 다시 전달하면 런타임 오류가 발생합니다. 이는 함수가 종료 된 후에 배열이 범위를 벗어나므로 스택에서 튀어 나왔기 때문입니다.

그러나 동적으로 할당하면 힙을 사용하고 해제하거나 프로그램을 종료 할 때까지 freeed가되지 않습니다. 따라서 배열의 시작 부분에 포인터를 놓고 원하는 시점까지 범위를 벗어나는 걱정없이 프로그램 전체에서 포인터를 사용할 수 있습니다.

+0

감사합니다. arasmussen, 고맙습니다. 내 관심은 주소록을 사용하는 두 번째 예에 있습니다. 배열에서 포인터로 전환하기위한 임계 값은 어디에 있습니까? 직원의 최대 수가 50000 대신 100 인 경우 어떻게됩니까? 이것은 단지 판결 요청일까요, 아니면 규칙이 있습니까? – Mark

+0

나는 항상 그것을 동적으로 할 것이다.어떤 값을 하드 코딩하는 것은 의미가 없습니다. 프로그램을 제한하고 사용하지 않아도되는 메모리를 사용하기 때문입니다. 이 시점에서 메모리의 유일한 제한은 프로그램이 아닌 하드웨어/설정입니다. 또한 정적 값을 사용하는 유일한 경우는 배열이 항상 동일한 크기 일 때입니다. 따라서 3D 좌표의 위치를 ​​저장하는 경우 항상 3 개의 좌표가 있으므로 3 개의 값이있는 배열을 사용하게됩니다. 그 역동 성을 만드는 데 의미가 없습니다. –

0

배열은 단순히 연속적인 메모리 덩어리입니다. 만약 배열을 선언하면을 (인덱스)없이 포인터

int foo[5]; 

foo을 갖도록 배열의 첫 번째 요소에 대한 포인터 . 마찬가지로

foo[0] = 1; *foo = 1; 

는 같은 일을 :

foo[1] = 2; 
*(foo + 1) = 2; 

것은 당신이 스택에 만드는 int foo[5];을 사용하여 배열을 만들 때. 이것은 현재 함수에 대해 국지적이며 일단 함수에서 복귀하면 더 이상 유효하지 않습니다.당신이 malloc() 메모리, 당신은

int *foo = malloc(sizeof(int) * 5); 
foo[0] = 1; 
*foo = 1; 

을 힙에 배열을 생성 (및 포인터를)하는 경우 당신이 그것을 완료하면 당신은이 메모리를 직접 관리해야하고, free()을 :

free(foo); 
1

일반적으로 처리 할 데이터의 전체 크기 또는 적어도 최대 데이터 크기를 알고있는 경우 배열을 사용하려고합니다. 이는 실제로 크기에 엄청난 변화가 예상되지 않는 경우에 특히 적용됩니다. 예를 들어 변형이 10 ​​~ 20 개 항목 인 경우 관계없이 20 개를 할당하고 완료하는 것이 가장 쉽습니다 (각 항목이 정말로 큰).

데이터 크기에 대해 미리 생각 해보지 않았거나 (중요한 가능성) 스택 스택을 계획하기에 너무 많은 것을 쉽게 처리 할 수 ​​있다면 동적 할당이 훨씬 유용합니다. 동적 할당의 가장 큰 약점은 크기를 알아야 할 필요가있는 경우 크기를 직접 추적해야하며 메모리 사용을 끝내면 메모리를 확보해야한다는 것입니다. C에서 많은 (특히 어려운, 잔소리가 많은) 문제는 해제 된 메모리를 사용하거나 사용을 끝낼 때 메모리를 사용하지 않는 것을 잊어 버립니다.

0

이 질문에도 대답이 있지만. 조금 다른 점에 대해서 이야기하겠습니다. C에서 때때로 런타임에 결정된 크기의 배열을 사용할 수 있습니다. 예 :

void foo (int a[], int n) { 
    int buf[n]; 
    /* do something with buf[] */ 
} 

이러한 종류의 배열은 스택에 할당되며 가변 크기입니다. malloc과 다른 점은 메모리가 free() 일 필요가 없다는 것입니다. 함수 호출이있을 때 처리됩니다. 물론 이것은 배열의 주소를 반환 할 수 없다는 것을 의미합니다.