itsource

정적 메모리 할당과 동적 메모리 할당의 차이

mycopycode 2022. 9. 25. 00:23
반응형

정적 메모리 할당과 동적 메모리 할당의 차이

정적 메모리 할당과 동적 메모리 할당의 차이점은 무엇입니까?

예를 들어 설명해 주시겠습니까?

다음은 표준 인터뷰 질문입니다.

동적 메모리 할당

는 실행 시 " " "를 사용하여 되어 있습니까?calloc(),malloc()그리고 친구들.히프 데이터 구조와는 무관하지만, 「히프」메모리라고도 불립니다.

int * a = malloc(sizeof(int));

됩니다.free() 입니다.아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.

자동 메모리 할당

이것은, 통상은 「스택」메모리라고 불리는 것으로, 새로운 스코프를 입력했을 때에 할당됩니다(통상은 새로운 기능이 콜스택에 푸시 되었을 때).범위를 벗어나면 자동 메모리 주소의 값은 정의되지 않으며 이러한 주소에 액세스하는 것은 오류입니다.

int a = 43;

스코프가 반드시 기능을 의미하는 것은 아닙니다.범위는 함수 내에 중첩될 수 있으며 변수는 선언된 블록 내에서만 범위가 지정됩니다.또, 이 메모리가 할당되어 있는 장소도 지정되어 있지 않은 것에 주의해 주세요(정상적인 시스템에서는, 이 메모리는 스택상에 있거나 최적화를 위해서 등록됩니다).

정적 메모리 할당

컴파일* 시에 할당되며, 스태틱메모리의 변수의 라이프 타임은 프로그램의 라이프 타임입니다.

에서는, 를 C 서 、 C 서 、 C c 、 C the the the the the the the the the the the the the the the the the the the the the the the 를 사용해 할당할 수 .static키워드를 지정합니다.이치노

키워드가 고려되면 일이 더 흥미로워진다.어떤 경우extern변수는 컴파일러가 메모리를 할당하는 정의입니다.어떤 경우extern변수가 선언되면 컴파일러는 변수를 다른 곳에 정의해야 합니다.선언/정의 실패extern 시 합니다.static변수는 컴파일 문제를 일으킵니다.

파일 범위에서 static 키워드는 옵션입니다(함수의 경우).

int a = 32;

그러나 기능 범위(기능 내부):

static int a = 32;

말하면, 「 」입니다.extern ★★★★★★★★★★★★★★★★★」static는 CC.의 두 입니다.

extern int a; /* Declaration */
int a; /* Definition */

*정적 메모리 할당에 관한 주의사항

컴파일 시 정적 메모리가 할당된다고 하기에는 다소 혼란스럽습니다.특히 컴파일 시스템과 호스트 시스템이 동일하지 않거나 아키텍처가 동일하지 않을 수 있습니다.

정적 메모리의 할당컴파일 시에 할당되는 것보다 컴파일러에 의해 처리된다고 생각하는 것이 좋습니다.

를 들어 는 큰 의 컴파일러를 할 수 .data로드되어 있는 , 「」됩니다.data프로그램의 세그먼트가 할당된 메모리의 위치로 사용됩니다.이는 대량의 스태틱메모리를 사용하는 경우 컴파일된 바이너리를 매우 크게 하는 단점이 있습니다.6줄 미만의 코드에서 생성된 멀티 기가바이트 바이너리를 쓸 수 있습니다.다른 옵션은 컴파일러가 프로그램을 실행하기 전에 메모리를 할당하는 초기화 코드를 주입하는 것입니다.과 OS에.실제로 최신 컴파일러는 휴리스틱스를 사용하여 이들 옵션 중 어떤 옵션을 사용할지 결정합니다.10k, 1m, 10m, 100m, 1G 또는 10G 항목의 대규모 정적 배열을 할당하는 작은 C 프로그램을 작성하여 직접 사용해 볼 수 있습니다.많은 컴파일러에서 바이너리 사이즈는 어레이의 크기에 따라 선형적으로 증가하며, 특정 시점을 지나면 컴파일러가 다른 할당 전략을 사용함에 따라 다시 축소됩니다.

메모리 등록

마지막 메모리 클래스는 'register' 변수입니다.예상대로 레지스터 변수는 CPU의 레지스터에 할당되어야 하지만, 실제로는 컴파일러에게 결정이 맡겨집니다.Address-of를 사용하여 레지스터 변수를 참조로 변환할 수 없습니다.

register int meaning = 42;
printf("%p\n",&meaning); /* this is wrong and will fail at compile time. */

대부분의 최신 컴파일러는 레지스터에 넣을 변수를 선택하는 데 사용자보다 더 능숙합니다.

참고 자료:

할당에는 스태틱, 자동, 다이내믹의 3가지 유형이 있습니다.

Static Allocation은 프로그램 시작 시 변수의 메모리가 할당되는 것을 의미합니다.프로그램 생성 시 크기가 고정됩니다.이는 글로벌 변수, 파일 범위 변수 및 다음과 같이 인증된 변수에 적용됩니다.static정의되어 있습니다.

자동 메모리 할당은 함수 내부에 정의되어 있는(비정적) 변수에 대해 이루어지며, 일반적으로 스택에 저장됩니다(단, C 표준에서는 스택을 사용하도록 의무화되어 있지 않습니다).이러한 메모리를 사용해 여분의 메모리를 예약할 필요는 없지만, 한편으로 이 메모리의 라이프 타임에 대한 제어도 제한됩니다.예: 함수의 자동 변수는 함수가 완료될 때까지만 존재합니다.

void func() {
    int i; /* `i` only exists during `func` */
}

동적 메모리 할당은 조금 다릅니다.이제 이러한 메모리 위치의 정확한 크기와 수명을 제어할 수 있습니다.메모리를 해방하지 않으면 메모리 누수가 발생하여 시스템이 메모리를 더 할당할 수 없기 때문에 애플리케이션이 크래쉬할 수 있습니다.

int* func() {
    int* mem = malloc(1024);
    return mem;
}

int* mem = func(); /* still accessible */

위의 예에서는 기능이 종료되어도 할당된 메모리는 여전히 유효하고 액세스할 수 있습니다.메모리를 모두 사용했으면 메모리를 해방해야 합니다.

free(mem);

정적 메모리 할당과 동적 메모리 할당의 차이

메모리는 프로그램 실행이 시작되기 전에 할당됩니다(컴파일 중).
메모리는 프로그램 실행 중에 할당됩니다.

실행 중에는 메모리 할당 또는 할당 해제 작업이 수행되지 않습니다.
메모리 바인딩은 실행 중에 확립 및 파기됩니다.

변수는 영구적으로 할당된 상태로 유지됩니다.
프로그램 유닛이 액티브한 경우에만 할당됩니다.

스택 및 힙을 사용하여 구현됩니다.
데이터 세그먼트를 사용하여 구현됩니다.

변수에 액세스하려면 포인터가 필요합니다.
동적으로 할당된 포인터는 필요하지 않습니다.

역동적이다
정적보다 실행 속도가 느립니다.

더 많은 메모리 공간이 필요합니다.
필요한 메모리 용량이 줄어듭니다.

스태틱 메모리 할당할당된 메모리는 스택에 있습니다.

int a[10];

동적 메모리 할당할당된 메모리는 힙 단위입니다.

int *a = malloc(sizeof(int) * 10);

C에는 Garbage Collector(GC; 가비지 콜렉터)가 없기 때문에 후자는 해방됩니다.

free(a);

정적 메모리 할당:

  • 변수가 영구적으로 할당됨
  • 프로그램 실행 전에 할당이 이루어집니다.
  • 스태틱 할당을 구현하기 위해 스택이라는 데이터 구조를 사용합니다.
  • 효율이 낮다
  • 메모리를 재사용할 수 없다.

동적 메모리 할당:

  • 변수는 프로그램 장치가 활성화된 경우에만 할당됩니다.
  • 프로그램 실행 중에 할당이 이루어집니다.
  • 동적 할당을 구현하기 위해 힙이라는 데이터 구조를 사용합니다.
  • 효율화
  • 메모리를 재사용할 수 있다.필요 없는 경우 메모리를 해방할 수 있습니다.

정적 메모리 할당:컴파일러는 선언된 변수에 필요한 메모리 공간을 할당합니다.오퍼레이터의 주소를 사용함으로써 예약된 주소를 얻고 이 주소를 포인터 변수에 할당할 수 있다.선언된 변수의 대부분이 정적 메모리를 가지고 있기 때문에 포인터 값을 포인터 변수에 할당하는 방법을 정적 메모리 할당이라고 합니다.메모리는 컴파일 시에 할당됩니다.

동적 메모리 할당:malloc() 또는 calloc() 등의 함수를 사용하여 동적으로 메모리를 가져옵니다.이러한 함수를 사용하여 메모리를 동적으로 가져오고 이러한 함수에 의해 반환되는 값을 포인터 변수에 할당하는 경우 이러한 할당을 동적 메모리 할당이라고 합니다.메모리는 실행 시 할당됩니다.

정적 메모리 할당은 컴파일 시간 중에 pf 프로그램을 실행하기 전에 메모리를 할당한다.동적 메모리 얼로케이션은 실행 시 프로그램 실행 중에 알로케이션된 메모리입니다.

언급URL : https://stackoverflow.com/questions/8385322/difference-between-static-memory-allocation-and-dynamic-memory-allocation

반응형