일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- NRVO
- UnrealEngine5
- RootMotion
- 백준
- RVO
- IFileDialog
- const
- directx
- GeeksForGeeks
- 티스토리챌린지
- 언리얼엔진5
- UE5
- C
- UnrealEngine4
- 팰린드롬 만들기
- winapi
- 오블완
- C++
- Frustum
- DeferredRendering
- Programmers
- 1563
- algorithm
- Unreal Engine5
- 줄 세우기
- DirectX11
- softeer
- 2294
- baekjoon
- 프로그래머스
- Today
- Total
Game Develop
[C++] 문자열리터럴 본문
const char* cc = "maxlevel";
위의 코드에서 "maxlevel"은 DataSegment의 rodata 영역에 저장된다. 아마 read only의 줄임말로 ro라 한것같다.
다만, 저런 리터럴값들이 DataSegment에 저장할 수도 있고, TEXT Segment (CodeSegment)에 저장될 수도 있다고 한다.
컴파일러마다 차이가 있다고 하니, 명심하자.
구글링하면 어떤 글은 Data Segment에 저장된다고 하고 어떤 글은 Text Segment에 저장된다고 나와있기 때문에 헷갈릴 수 있다. 일단 Data Segment라고 가정하겠다.
어쨌든 문자열리터럴은 readOnly영역에 있기 때문에, cc[0] = 's' 이런식으로 값수정은 불가능하다.
그래서 char*에 문자열을 담을 때는 반드시 const를 붙여야 한다. 안붙이면 어차피 컴파일에러난다.
수정할 수 없는 메모리영역에 있는 값이기 때문이다.
그러면 아래코드는 어떨까
char ca[9] = "maxlevel";
ca[1] = 's';
이 코드는 정상적으로 수행된다.
char* 코드와 마찬가지로 "maxlevel"이라는 문자열리터럴은 DataSegment의 rodata영역에 저장되는건 그대로다.
다만, char 배열에 들어있는 문자열은 rodata영역에 있는것의 '사본'이다.
"maxlevel"의 사본을 read-write가 가능한 스택에다가 할당했기 때문에 []같은 첨자연산자로 값조작이 가능한것이다.
물론 char 배열로 문자열을 저장해놓을 경우, 사본까지 가지고 있어야하기 때문에 메모리를 더 써야한다.
만약 값을 조작해야하는게 아니라면 const char*로 문자열을 저장하는게 메모리효율에선 더 좋다.
'C++ > C++' 카테고리의 다른 글
[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 |
[C++] Iterator (반복자) (0) | 2022.11.02 |