(C/C++) 참고용 정리 - 변수와 리터럴, 그리고 메모리
변수
변수라 함은 자바에서 정리했 듯이 아래와 같다.
짧게 얘기하면 변하는 수
길게 얘기하면 단 하나의 값을 저장할 수 있는 메모리 상의 공간.
리터럴
리터럴이라 함은 자바에서 정리했 듯이 아래와 같다.
짧게 얘기하면 변하지 않는 값
길게 얘기하면 우리는 변하지 않는 값을 일상생활에서는 상수라고 불렀다.
하지만 상수는 프로그래밍 세계에서는 좀 다른 뜻으로 불리기 때문에
그와 차별성을 부여하기 위해 리터럴이라고 붙였다.
“ch”, ‘c’, 123, 123.55 등등 모두 리터럴이다.
내가 위에서 정의한 말들이 맞을까?
좀 부족한 부분이 있는 것 같다.
아래의 경우를 보자.1
2
3
4
5
6
7
int main() {
int num = 1 + 2;
printf("%p", &num); num의 주소값이 나온다.
return 0;
}
num은 변수기 때문에 메모리를 4byte 잡아먹고 그 안에
00000000 00000000 00000000 00000011
이런 값이 들어있다.
그럼 리터럴인 1과 2는 메모리 상에 적재되지 않는 걸까…?
CPU에서 연산을 하기 위해서는 메모리 상에 있는 데이터들을 끌고 와야한다.
메모리 상에 없는 데이터는 CPU에서 끌고 올 수가 없으니 연산 및 처리가 불가능하다.
따라서 리터럴인 1과 2도 메모리 상에 올라가야한다는 것이다.
이 1과 2도 메모리 상의 어딘가
에 적재가 된다.
그 어디가 어딘지는 아무도 모른다.
(메인)메모리(RAM, Random Access Memory)의 특성상
비어있는 공간 랜덤한 부분에 적재되지 않을까 싶다.
정수 리터럴의 기본 크기는 모르지만 아마 4byte이지 않을까… 싶다.
즉 1을 저장할 4byte 공간, 2를 저장할 4byte 공간이 따로 필요하게 된다.
그리고 이러한 연산이 끝난 이후에는 가비지 컬렉팅 대상이 되어 소멸되게 되는 것이다.
즉 리터럴도 메모리 상에 할당이 되고, 변수도 메모리 상에 할당이 된다.
그럼 그 차이점을 아래의 표로 나타내보았다.
| 변수 | 리터럴
— | — | —
할당 형태 | 정적 할당 | 동적 할당
메모리 주소 | 알 수 있음(재호출 가능) | 알 수 없음(재호출 불가)
가비지 컬렉팅 | 자세히 모르겠음 | 연산 되자마자
캐싱 | 메모리 주소에만 접근하면 되므로 캐싱을 함 | 매번 새로운 메모리 공간을 만들어야 하므로 캐싱하지 않음