평생 배우는 개발자

stack과 heap 본문

개발면접준비

stack과 heap

개발지식 블로그 2024. 12. 30. 15:29

서론

스택공간과 힙공간이 있는데 이것들은 무엇이며 언제 쓰고 어떤 역할을 할까?

 

본론

 

스택

스택은 정적 메모리 할당에 사용되는 공간이다. 

스택은 함수 호출이나 로컬 변수가 저장된다. 이 때 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함수가 저장된 상태

main함수가 호출되면 Compiler의 Call Stack이라는 곳에 main함수를 실행했다는 call이 저장된다.

처음 main함수에서 functionA가 호출 되면 Call Stack에 메모리가 쌓인다.

functionA가 실행된 후 CallStack

이후 fucntionA에서 functionB가 호출 되면 한 번 더 Call Stack에 메모리가 쌓인다.

functionB가 호출 된 후

이후 fuctionB가 끝난다면 callStack에서 pop 된다.

functionB가 끝난 후

위에서는 Call Stack에 저장된 함수들의 메모리를 살펴보았다. 그런데 함수 호출이나 로컬 변수가 저장되었다고 했는데 로컬 변수는 어디에서 볼 수 있을까?

로컬 변수는 local이라는 디버그창에서 찾아볼 수 있다.

functionA의 로컬 변수들의 메모리

 

이처럼 우리가 알고 있는 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 디버거 창으로 보면 다음과 같다.

ptr의 메모리 공간 상태

이처럼 임의의 메모리공간이 할당된다. 이때 우리는 5칸의 공간(cdcdcdcd)을 할당했고 마지막 fdfdfdfd부분은 이 공간의 끝을 가리키기 위해 끝을 알리는 값으로 채워진다.  위 예제 코드에서 loop문을 모두 실행하고 나오면 순서대로 0,10,20,30,40이 저장되어야 한다. 다음은 값을 저장한 후의 상태이다.

값이 저장된 이후의 모습

위를 살펴보면 4byte의 int공간에 Hexadecimal형태로 숫자가 저장된 모습이 보인다.

delete[] ptr;이 실행된 후의 모습

위 사진에서 5개의 공간과 끝을 알리는 공간까지 모두 delete가 되었다.

 

이처럼 힙은 개발자가 직접 할당과 해제를 해주어야 하며 그 공간의 크기가 stack에 비해 매우 크기 때문에 대용량의 메모리를 저장해야 할 때 쓰인다.

또한 런타임에 동적으로 크기가 변경될 수 있다.

 

std::vector의 크기가 변경 될 때

서론#include , c++ 이 기본으로 제공하는  벡터 라이브러리다.우리가 벡터를 선언하면 스택이라는 공간에 벡터가 생성된다. 그렇다고 벡터 안의 값들도 스택에 생성되는 것은 아니다. 이것들은 힙

learn-forever.tistory.com

결론

스택과 힙 공간에 대해서 알아보았다.

스택은 정적메모리가 할당되는 공간이며 속도가 빠르고 LIFO형식으로 메모리가 쌓인다. 자동으로 할당, 해제된다.

힙은 동적메모리가 할당되는 공간이며 크기가 크고 직접 할당, 해제해야 하며 런타임에 크기가 변경될 수 있다.

마무리

위의 내용을 바탕으로 개발자 면접 간

1. 스택은 무엇이고 힙은 무엇인가요?

2. 각각 어떤 상황에서 쓰이나요?

3. 각각의 장단점은 무엇인가요?

등에 대한 질문을 생각해 볼 수 있겠다. 스스로에게 질문을 해보고 답해보자.

 

헷갈리는 부분은 보완하기! 찡긋 O.<

 

틀린 부분이나 보완해줬으면 하는 내용이 있으면 댓글로 알려주세요! 추가 설명이 필요하신 부분도 댓글로 알려주세요.

어떠한 피드백도 환영입니다. 긴 글 읽어주셔서 감사합니다.