메모리 공간
<정적 메모리 - 컴파일 단계에서 검사를 마치고 저장/할당된다>
Code 영역
함수, 상수
Data 영역
전역 변수, 정적 변수(static)
<동적 메모리>
Heap 영역
동적 할당
->런타임에 크기 결정
Stack 영역
지역, 매개 변수
컴파일 타임에 크기 결정
overflow / underflow
C/C++에서는 전역/정적 변수 선언시 자동으로 0으로 초기화된다
동적 할당과 정적 할당
동적 할당과 정적 할당은 메모리 공간을 언제 할당하느냐에 따라 나뉘어진다
- 동적 할당의 특징
프로그램 실행 단계에서 공간 할당이 이루어진다
메모리 크기가 고정되어있지 않아서 내가 원하는 메모리만큼 할당할 수 있다
더 이상 사용하지 않는 공간은 사용자가 직접 해제 해줘야한다
Heap영역을 포인터로 가르켜 할당한다
C++에서 동적 할당은 new / delete C에서는 malloc / free를 사용한다
- 정적 할당의 특징
컴파일 단계에서 공간할당이 이루어진다
메모리 누수가 없다 - 해당 함수가 사라질 때 운영체제에서 알아서 해제한다
메모리 공간의 크기가 byte단위로 정해져있어서 메모리 공간의 낭비가 발생할 수 있다
Stack공간에서 메모리 공간을 빌려온다
static, const, extern, auto 키워드
- static
한 번 생성된 후에는 선언문을 또 만나도 생성되지 않는다 -> 한 번 할당된 후에는 더 이상 할당되지 않는다
값 변경은 가능하다
정적 변수로 Data영역에 할당된다
지역 변수일 때는 호출 시점 (할당 시점)에 생성된다
멤버 변수일 때는 컴파일 완료 후(프로그램 시작 시점)에 생성된다
- const
상수화
선언할 때 초기화한 뒤에는 값 변경이 불가능하다
const int a = 10;
int const a = 10;
위의 두 const는 동일한 역할을 한다
함수에 붙은 const들
int Func(const int a);
매개변수에 붙은 const는 해당 파라미터의 값을 변경할수 없다는 뜻이다
함수 뒤에 붙는 const는 해당 클래스의 멤버 변수 변경 불가능이다
const를 붙여서 오버로딩 된 함수는 const 객체로 호출되어야한다
const int Func() { return 10; }
리턴값 앞에 붙은 const는 리턴값을 상수화한다
하지만 이처럼 a에 할당받아서 a의 값을 변경하는건 가능하기 때문에 const를 붙인 의미가 거의 없어보인다
함수의 리턴값 앞에 붙은 const는 레퍼런스로 받을 때 의미가 있어진다
위 사진처럼 const를 붙이지 않은 함수 GetA()는 a값을 변경할 수 있다
실제로 e.GetA()의 결과값은 10이 나온다
하지만 const를 붙이면 a값을 변경할 수 없도록 에러가 난다
이렇게 리턴값을 함부로 변경하려는 것을 방지할 수 있다
- extern
클래스 외부에서 선언된다
다른 소스 파일에서도 접근 가능하다
- auto
자료형을 실시간으로 매핑한다
사용하려는 자료형이 컴파일되어있다는 전제하에 사용 가능하다
-> 멀티컴파일 환경에서는 해당 파일이 컴파일 되어있는지 아닌지 확신할 수 없기 때문에 에러가 발생한
'> 개념' 카테고리의 다른 글
[게임 수학] 벡터의 내적과 외적 활용 (0) | 2024.01.06 |
---|---|
[C++] 생성자 (0) | 2023.12.01 |
[C++] #pragma pack (0) | 2023.06.24 |
[게임 수학] 사원수 (Quaternion) (0) | 2023.06.04 |
[C++] Hash (0) | 2023.06.04 |