본 내용은 POCU COMP2200: C 언매니지드 프로그래밍 강의를 토대로 작성하였습니다.
- 스택(stack) 메모리
- 우선 자료구조인 스택이랑 헷갈리지 말 것
- 둘 다 작동방법이 동일해서(LIFO) 스택이란 이름을 쓸 뿐
- 각 함수에서 사용하는 지역 변수 등을 임시적으로 저장하는 공간
- 스택 메모리의 크기는 프로그램 빌드 시에 결정됨
- 스택 메모리의 위치는 실행 시에 결정됨
- 우선 자료구조인 스택이랑 헷갈리지 말 것
- 기본 자료형 변수는 스택 메모리를 차지!
- 여태까지 모든 기본 자료형 변수(char, int, float)를 new 없이 사용할 수 있었던 이유가 바로 스택 메모리에 할당됐기 때문
- 기본 자료형을 함수 매개변수로 전달하면 스택에 복사본을 만듦 -> 이게 바로 값형
- 스택 메모리를 빌리고 반환할 때마다 언제나 빈 공간 없이 차곡차곡 쌓여 있음
- new로 만든 데이터는 힙(heap) 메모리에 할당됨
- 이 경우 메모리에 구멍이 뚫릴 수 있음
- 스택 메모리에 대해서 간단히 알아보자
- ESP + EBP = 스택 프레임
- 배열도 스택 메모리에 들어감
- 스택의 크기는 한정적이지 않나요?
- 맞음
- 당연히 타겟 플랫폼 따라 달라짐
- 심지어 프로그래머가 컴파일 시 스택의 크기를 정해줄 수도 있음
- clang windows에서 아무 것도 안 정해주면 대략 1MB 정도
- 스택이 터진다~ 스택 오버플로
- 스택의 크기가 약 1MB일 때, 이런 코드를 실행하면 곧바로 스택 오버플로 남
- 너무 큰 데이터는 스택에 넣으면 안 됩니다
- 따라서 너무 큰 데이터를 사용할 때는 스택에 넣을 수 없음
- 이럴 경우에 사용하는 것이 동적 메모리 할당(C#에서는 new를 사용)
- OS에게 메모리 달라고 부탁하는 것
- 배열의 요소 개수 구하는 방법
- sizeof(values)는 values 배열이 차지하는 총 바이트 수를 반환
- 그 이유는?
- 이 배열이 스택에서 몇 바이트를 차지하는지 컴파일 중에 알기 때문
int values[30];
size_t array_size = sizeof(values); //120
- 함수의 스택 메모리 사용량은 고정
- 함수는 호출자가 누구든 간에 딱 정해진 수와 크기의 매개변수가 들어온단 가정으로 동작
- 함수가 먼저 결정되고, 호출자는 그 함수를 호출할 뿐
- 즉, 함수는 호출자가 뭐하는 놈인지 모름
- sizeof(매개변수)가 4를 반환한 이유는?
- 따라서 배열을 매개변수로 전달할 때는 실제 모든 요소를 스택에 넣지 않음
- 그 대신 그 배열의 시작 위치(주소)를 스택에 넣어줌
- 이 주소 크기 = 포인터 데이터형의 크기
- 32비트 플랫폼에서는 4 바이트, 64비트에서는 8바이트
- 그래서 sizeof()를 하면 4바이트가 나온 것
'C' 카테고리의 다른 글
[C] 연산자 우선순위와 평가 순서 , 범위(scope), const (0) | 2022.02.26 |
---|---|
[컴퓨터의 작동 원리] 컴퓨터 메모리의 기본 구조 (0) | 2022.02.16 |
[C] #include,stdio.h, C 기본 문법 (0) | 2022.02.14 |
[컴퓨터의 작동 원리] 컴퓨터를 켤 때 일어나는 일들 / 운영체제가 해주는 일들 (0) | 2022.01.21 |
[컴퓨터의 작동 원리] 컴퓨터의 구성 요소들 (0) | 2022.01.21 |
댓글