C - 스택 메모리

업데이트:

C의 기본 자료형 변수는 스택 메모리를 차지한다.

  • new 키워드 없이 사용할 수 있었던 이유. 스택 메모리에 할당되기 때문.
  • 기본 자료형을 함수 매개변수로 전달하면 스택에 복사본을 만듦 -> 값형
  • 스택 메모리를 빌리고 반환할 때마다 언제나 빈 공간 없이 차곡차곡 쌓여 있음(실제 메모리에서 순서대로 쌓이지는 않음. 가상 메모리로 인해)
    • 정확히 함수 호출이 몇 바이트를 사용할지 알 수 있음
  • new로 만든 데이터는 heap 메모리에 할당됨
    • 메모리에 구멍이 뚫릴 수 있음

C 배열은 참조형이 아니다. (char ch[64]) new로 만든 데이터가 아님.

참고로 java에서 배열은 기본적으로 참조형이다.

  • https://www.geeksforgeeks.org/array-primitive-type-object-java/

어셈블리 언어에서 사용하는 용어

  • ESP : Extended Stack Pointer
    • 현재 스택 포인터
  • EBP : Extended Base Pointer
    • 현재 스택 프레임의 기본(첫) 주소(입구)
  • 스택 프레임
    • 각 함수가 사용하는 스택 메모리의 범위

스레드의 경우 각각 별도의 스택 영역을 가지는데, 메모리의 할당은 스레드가 생성하는 시점에 할당한다.

너무 큰 데이터는 스택에 넣으면 안됩니다.

  • stackOverFlow가 발생할 수 있음.
  • 이럴 경우 동적 메모리 할당(new)

재귀 함수에서 스택오버플로 나는 이유

  • 함수 호출때마다 해당 함수 스택 프레임만큼의 바이트를 할당받음
  • 무한으로 호출하다 보면 스택 메모리 공간을 다 써버림.

sizeof(arg)와 배열의 총 바이트 수

  • sizeof()가 매개변수로 들어온 배열의 총 바이트 수를 반환할 수 있으려면
  • 그 배열의 모든 요소가 스택에 전부 복사되어야 함

그러나 ! 함수는 호출자가 누구든 딱 정해진 수와 크기의 매개변수가 들어온단 가정으로 동작

따라서 ! 배열을 매개변수로 전달할 때는 실제 모든 요소를 스택에 넣지 않음

  • 대신 배열의 시작 위치(주소)를 스택에 넣어줌
  • 주소의 크기 = 포인터 데이터형의 크기
  • 32비트 플랫폼에서는 4바이트, 64비트에서는 8바이트
  • 그래서 sizeof()를 하면 4바이트가 나온 것.

참고

POCU 강의 “C 언매니지드 프로그래밍”

태그: ,

카테고리:

업데이트:

댓글남기기