일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- algorithm
- softeer
- GeeksForGeeks
- IFileDialog
- UnrealEngine5
- C++
- Unreal Engine5
- const
- C
- winapi
- Frustum
- UnrealEngine4
- RootMotion
- 백준
- Programmers
- DeferredRendering
- 2294
- UE5
- 오블완
- 티스토리챌린지
- 줄 세우기
- DirectX11
- 프로그래머스
- 언리얼엔진5
- 1563
- RVO
- NRVO
- baekjoon
- directx
- 팰린드롬 만들기
- Today
- Total
Game Develop
[C++] 프로세스 메모리 세그먼트들 본문
Text 세그먼트(혹은 Code 세그먼트)는 일반적으로 변하지 않는 영역이고, 변하지 않아야하는 영역이다.
그래서 ReadOnly 영역이며, 그렇기 때문에 리터럴값들이 여기에 저장될 수도 있는듯 하다.
위 이미지에선 리터럴값이 rodata(.rdata)에 저장되어진다고 나와있는데, 숱한 구글링을 통해 지식들을 취합해본 결과,
컴파일러에 따라 rodata 세그먼트일 수도 있고, Text세그먼트일 수도 있다고 한다.
Data 세그먼트(.data)는 보통 초기화된 전역변수나 정적변수가 들어있다고 한다.
거기서 좀 더 쪼개자면, '초기화된 읽기전용 영역'과 '초기화된 읽기-쓰기 영역'으로 나눌 수 있다.
아래 두 변수가 전역이라는 가정하에
// 전역변수
const char* cp = "maxlevel"; // 초기화된 읽기전용 영역에 "maxlevel" 저장.
char ca[9] = "maxlevel"; // 초기화된 읽기-쓰기 영역에 "maxlevel"에 저장.
이라고 볼 수 있다.
BSS 세그먼트(.bss)는 초기화되지 않은 데이터세그먼트이다. Block Started by Symbol의 줄임말이라고 한다.
프로그램의 실행과 함께, 커널(스타트업 코드)에 의해 0으로 초기화된다.
int i; 같이 초기화되진 않은 전역변수들을 포함한다.
그리고 위의 이미지에 보면 const라는 세그먼트의 값을 DATA 세그먼트에 복사한다고 되어있는데 해당부분에 대해 설명하자면, Data세그먼트는 초기화된 전역변수나 정적변수를 포함한다고 했다.
그 초기화시키기 위한 값자체는, 미리 위의 이미지처럼 ROM or Flash에 배치되어있는 rodata세그먼트나 Const세그먼트에 값이 초기화되고 그 값을 Data세그먼트에 복사해서 Data세그먼트의 전역변수의 값들을 초기화시키는것이다.
그리고 왜 이렇게 세그먼트단위로 나눠서 관리할까??? 라는 의문에 대해서는, 아래 추가한 다른 분의 글을 참고하는걸 추천한다.
https://embeddedchallenge.tistory.com/458
쉽게 설명하셨는데 요약하자면,
RAM에 올리는것들은 read-write해야하기 때문이고, 리터럴값들 같은것은 read만 하는 값들이기때문에 굳이 공간부족한 RAM에 올릴필요없이 ROM에 저장하는 것..이라고 생각한다.
'C++ > C++' 카테고리의 다른 글
[C++] const객체는 마음대로 멤버함수를 호출할 수 없다. (1) | 2022.11.29 |
---|---|
[C++] vector사용 시, reserve를 해주자. (0) | 2022.11.23 |
[C++] 문자열리터럴 (0) | 2022.11.19 |
[C++] memcpy 사용해서 char배열 복사 (0) | 2022.11.19 |
[C++] erase()와 iterator (1) | 2022.11.15 |