일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Fetching
- bvh
- 코테
- 외적
- Tesselation
- 포워드 렌더링
- Page Fault
- Stack
- DrawCall
- 스택
- c++
- 이중우선순위큐
- 그래픽스 파이프라인
- 힙
- im뱅크
- 개발자면접
- 취준
- Output Merge
- 디퍼드 렌더링
- 어레이
- vertex shader
- multiset
- graphics rendering pipeline
- UnReal
- occlusion culling
- Input Assembler
- Mipmap
- std::vector
- rasterization
- 데이터분석
- Today
- Total
평생 배우는 개발자
stack과 heap 본문
서론
스택공간과 힙공간이 있는데 이것들은 무엇이며 언제 쓰고 어떤 역할을 할까?
본론
스택
스택은 정적 메모리 할당에 사용되는 공간이다.
스택은 함수 호출이나 로컬 변수가 저장된다. 이 때 LIFO(Last In First Out) 구조로 메모리가 자동으로 저장이 되고 해제가 된다.
#include <iostream>
using namespace std;
void functionB(int a) {
int localB = a * 2; // 지역 변수
cout << "functionB: " << localB << endl;
}
void functionA(int b) {
int localA = b + 5; // 지역 변수
functionB(localA); // functionA 호출
cout << "functionA: " << localA << endl;
}
int main() {
int x = 10; // main 함수의 지역 변수
functionA(x); // functionB 호출
return 0;
}
위의 예시코드를 실행 해보면서 stack에 어떤 값들이 저장되는지 알아보자.
main함수가 호출되면 Compiler의 Call Stack이라는 곳에 main함수를 실행했다는 call이 저장된다.
처음 main함수에서 functionA가 호출 되면 Call Stack에 메모리가 쌓인다.
이후 fucntionA에서 functionB가 호출 되면 한 번 더 Call Stack에 메모리가 쌓인다.
이후 fuctionB가 끝난다면 callStack에서 pop 된다.
위에서는 Call Stack에 저장된 함수들의 메모리를 살펴보았다. 그런데 함수 호출이나 로컬 변수가 저장되었다고 했는데 로컬 변수는 어디에서 볼 수 있을까?
로컬 변수는 local이라는 디버그창에서 찾아볼 수 있다.
이처럼 우리가 알고 있는 stack의 형태를 갖추고 함수의 호출과 로컬 변수들이 stack이라는 메모리 공간에 자동으로 저장이 되고 자동으로 해제가 된다.
스택이라는 공간은 크기가 제한적이라 접근이 빠르지만, 스택오버플로우가 발생할 수 있다.
힙
힙 공간은 스택공간과 다르게 동적 메모리할당에 사용되는 곳이다. 런타임에 메모리크기가 결정되며 개발자가 직접 관리 해야 한다. 즉, 자동으로 메모리가 해제되지 않기 때문에 사용이 끝난 메모리에 대해서는 명시적으로 해제를 해야한다.
다음 예제 코드를 디버깅하면서 살펴보자
#include <iostream>
using namespace std;
void allocateMemory() {
int* ptr = new int[5]; // 힙에 5개의 정수 공간 할당
for (int i = 0; i < 5; ++i) {
ptr[i] = i * 10; // 값 설정
}
cout << "Allocated memory at: " << ptr << endl;
// 할당된 메모리 확인을 위해 디버깅 중단점 설정 가능
delete[] ptr; // 힙 메모리 해제
cout << "Memory deallocated." << endl;
}
int main() {
allocateMemory();
return 0;
}
위 예시에서 동적할당을 사용하여 ptr을 선언했다. 이때 ptr이 가리키는 공간을 memory 디버거 창으로 보면 다음과 같다.
이처럼 임의의 메모리공간이 할당된다. 이때 우리는 5칸의 공간(cdcdcdcd)을 할당했고 마지막 fdfdfdfd부분은 이 공간의 끝을 가리키기 위해 끝을 알리는 값으로 채워진다. 위 예제 코드에서 loop문을 모두 실행하고 나오면 순서대로 0,10,20,30,40이 저장되어야 한다. 다음은 값을 저장한 후의 상태이다.
위를 살펴보면 4byte의 int공간에 Hexadecimal형태로 숫자가 저장된 모습이 보인다.
위 사진에서 5개의 공간과 끝을 알리는 공간까지 모두 delete가 되었다.
이처럼 힙은 개발자가 직접 할당과 해제를 해주어야 하며 그 공간의 크기가 stack에 비해 매우 크기 때문에 대용량의 메모리를 저장해야 할 때 쓰인다.
std::vector의 크기가 변경 될 때
서론#include , c++ 이 기본으로 제공하는 벡터 라이브러리다.우리가 벡터를 선언하면 스택이라는 공간에 벡터가 생성된다. 그렇다고 벡터 안의 값들도 스택에 생성되는 것은 아니다. 이것들은 힙
learn-forever.tistory.com
결론
스택과 힙 공간에 대해서 알아보았다.
스택은 정적메모리가 할당되는 공간이며 속도가 빠르고 LIFO형식으로 메모리가 쌓인다. 자동으로 할당, 해제된다.
힙은 동적메모리가 할당되는 공간이며 크기가 크고 직접 할당, 해제해야 하며 런타임에 크기가 변경될 수 있다.
마무리
위의 내용을 바탕으로 개발자 면접 간
1. 스택은 무엇이고 힙은 무엇인가요?
2. 각각 어떤 상황에서 쓰이나요?
3. 각각의 장단점은 무엇인가요?
등에 대한 질문을 생각해 볼 수 있겠다. 스스로에게 질문을 해보고 답해보자.
헷갈리는 부분은 보완하기! 찡긋 O.<
틀린 부분이나 보완해줬으면 하는 내용이 있으면 댓글로 알려주세요! 추가 설명이 필요하신 부분도 댓글로 알려주세요.
어떠한 피드백도 환영입니다. 긴 글 읽어주셔서 감사합니다.
.
'개발면접준비' 카테고리의 다른 글
어레이와 리스트의 차이 (2) | 2025.01.03 |
---|---|
포워드 렌더링과 디퍼드 렌더링 (1) | 2025.01.02 |
가상함수,순수가상함수,추상클래스,인터페이스 (10) | 2024.12.21 |
set 과 multiset 그리고 map과 multimap 그리고 unordered_map (8) | 2024.12.19 |
DrawCall, Batching, Occlusion Culling (1) | 2024.12.17 |