메모리 구조와 정적할당과 동적할당
스택(stack)
- 지역변수, 매개변수, 함수가 저장되며 컴파일 시 크기가 결정
- 함수가 함수를 호출하는 등에 따라 런타임시에도 크기가 변경
힙(heap)
- 힙은 동적 할당할 때 사용되며 런타임 시 크기가 결정
데이터 영역
BSS 영역과 Data영역으로 나누어지고 정적 할당에 관한 부분을 담당
- BSS 영역
- 전역변수, static, const로 선언되어 있는 변수 중 0으로 초기화 또는 초기화가 어떠한 값으로도 되어 있지 않은 변수들이 이 메모리 영역에 할당
- Data 영역
- 전역변수, static, const로 선언되어있는 변수 중 0이 아닌 값으로 초기화된 변수가 이 메모리 영역에 할당
코드영역
- Code / Text 영역
- 프로그램의 소스코드가 할당
이어서 배열에서의 정적 할당과 동적 할당을 확인해보자
C++ 배열 정적 할당 및 동적 할당
배열을 원하는 사지으로 생성할 수 있는가?라는 질문에 자연스럽게
int size = 0;
cin >> size;
int array[size];
// 를 자연스럽게 생각하게 되었는데 아니였다.
위 코드가 작동하지 않는 이유는 C++에서는 배열 크기가 컴파일 타임 상수로 결정되어야 하기 때문이다.
컴파일 타임 상수
- 컴파일 시점에 값이 결정되는 상수
- 즉, 프로그램이 실행되기 전에 컴파일러가 그 값을 정확히 알 수 있는 변수나 상수를 의미한다.
const int size = 5; // 컴파일 타임 상수
int value;
cin >> value; // 런타임 상수
1. 정적 배열 크기 요구사항:
- int array [size]; 정적 배열 선언
- C++ 표준에서는 배열 크기가 컴파일 타임에 정해진 상수여야 한다.
- 하지만 size는 런타임에 입력(cin)으로 받아오기 때문에 배열 크기를 컴파일 타임에 알 수 없다.
2. Variable Length Array(VLA):
- C99 표준 이후의 C언어에서는 Variable Length Array(VLA)를 허용해서 배열 크기를 런타임에 동적으로 설정할 수 있지만, 표준 C++에서는 VLA를 지원하지 않는다.
- 몇몇 컴파일러에서는 표준 C++에서도 VLA를 비표준 확장 기능으로 지원하지만 → 사용하지 말자
그러면 어떻게 해결해야 하는가?
1. 동적 할당 사용 (new 또는 std::vector)
런타임에 크기를 결정하려면(입력을 받아서?) 동적 메모리 할당을 사용해야 한다.
#include <iostream>
using namespace std;
int main() {
int size = 0;
cin >> size;
int* array = new int[size]; // 동적 배열 할당
// 배열 사용
delete[] array; // 동적 배열 해제
}
2. std::vector 사용
c++에서는 동적 크기 배열을 위해 std::vector를 사용하는 것이 더 권장된다.
#include <iostream>
#include <vector> // vector include 적용
using namespace std;
int main() {
int size = 0;
cin >> size;
vector<int> array(size); // 동적 크기 배열 생성
// 작업 수행
}
std::vector는 메모리 관리가 자동으로 되기 때문에 메모리 해제(delete [])를 수동으로 할 필요가 없다.