2022. 4. 9. 00:29ㆍProgramming language/C, C++
- 목차
이 글은 이전에 운영하던 깃 블로그에서 옮겨온 글입니다.
서론
이번 글에서는 포인터에 관한 개인적인 고찰에 대해서 적어보려 합니다.
포인터는 자료형이다
정수형 자료형 int, 문자형 자료형 char… 프로그래밍을 하면서 참 많이 보는 것들입니다.
이런 것들을 자료형이라고 한다. 자료의 형태라는 것인데… 포인터도 자료형일까요?
개인적인 생각으로는 자료형이라고 생각합니다. 단지 int가 정수를 값으로 사용하고 char가 문자를 값으로 사용하는 것처럼 포인터 자료형은 주소 를 값으로 사용하고 있죠. 즉, 주소 값을 저장하기 위한 메모리 공간일 뿐이라는 것입니다.
참고로, 모든 포인터타입은 4byte(32bit 컴퓨터 기준, 64bit는 8byte 크기)입니다.
포인터는 왜쓰지?
옛날에 프로그래밍을 처음 공부하면서, 포인터를 왜 쓸까?라는 의문을 가진 적이 있습니다. 지금 와서 생각해보면 참조하여 사용하기 위해서가 아닐까 생각이 드네요.
예를 들어, 몬스터 모델링 정보를 저장하는 구조체가 있다고 가정해보죠. 이 정보에는 정점 정보, 노멀 값, uv좌표, 애니메이션 정보 등의 방대한 정보를 내포하고 있을 겁니다. 몬스터 객체들은 각각 모델링 정보가 있어야 렌더링이 된고... 음… 모든 몬스터가 같은 모델링 정보를 사용하는데 단순히 모델링 정보 구조체를 각각 포함하고 있다면? 메모리가 참으로 유감스럽지 않을까 싶습니다. 아무리 활용 메모리들이 점점 커진다고 해도 언제나 작고 소중한 메모리의 절약은 중요하죠.
어차피 모델링 정보를 공유할 수 있다면, 각 객체가 정보를 복사해서 가질 필요 없이 참조 만 하면 됩니다. 해당 모델링 구조체의 포인터를 사용해서 말입니다. 모델링 정보를 하나만 할당해놓고 각 객체가 모델링 구조체의 포인터를 통해서 참조만 한다면 메모리 낭비 없이 마치 각각 모델링 정보를 가지고 있는 효과를 낼 수 있습니다.
이처럼 참조는 포인터는 강력한 친구입니다. 아무래도 모델링 정보가 4byte 혹은 8byte보다는 크지 않겠죠?
이게 바로, 4byte(혹은 8byte)의 메모리 공간만으로 더 큰 메모리를 참조하여 사용할 수 있게 해 주는 게 포인터를
사용하는 이유가 아닐까 생각합니다.
포인터 자료형이 다양한 이유
int, char처럼 다양한 형태를 보았을 겁니다. 사실 저것은 다 같은 거라 보시면 돼요. 모두 주소 값을 저장하는 메모리 공간이고, 실제로 크기를 측정해보면 4 or 8byte로 동일하니까요. 그렇다면 왜 굳이 저렇게 여러 형태가 존재할까? 예를 하나 들어보겠습니다.
- 32bit 운영체제에서의 상황 (포인터의 크기는 4byte)
- 4byte 구조체(A), 12byte 구조체(B) 인스턴스가 각각 할당되어 있다고 가정
- 만약 포인터의 자료형 타입이 나뉘지 않고 통일되어 있다면?
4byte의 포인터 메모리 공간에는 A와 B의 주소 값이 저장되므로 문제없이 참조할 수 있을 것 - 과연?
A 구조체는 4바이트를 읽어야 사용할 거고 B는 12바이트를 읽어야 사용할 텐데 포인터는 메모리 주소만을 알고 있을 뿐 얼마나 읽어야 할지는 모르는 상태
즉, 포인터의 자료 타입이 다양한 이유는 포인터가 얼마만큼의 크기를 읽어야 하는지를 알기 위함입니다.
다른 예로, 포인터를 사용하여 8byte의 실수형 값을 4byte 메모리 공간에 쓰면 잘리지 않겠습니까?(32bit 운영체제 기준)
이런 이유 때문에 포인터의 자료형이 다양한 게 아닐까요?
마무리
C++을 하면서, 많은 분들이 포인터 부분에서 절망을 하신다고 합니다. 개념도 어렵고, 존재 이유를 이해하기도 어렵기 때문이라고 하는데요. 저도 처음에는 같은 상황이었지만 사용하다 보니, 알려고 하다 보니 이런 고찰을 하게 되었습니다. 어디까지나 고찰(주관)이기 때문에 100프로 맞다고 할 수 없겠지만, 그래도 이론적으로 정의되어 있는 내용들과 크게 다른 것은 없다고 생각합니다.
'Programming language > C, C++' 카테고리의 다른 글
[C/C++]네임 맹글링(Name mangling) (0) | 2022.04.09 |
---|---|
[C/C++]C++의 키워드 몇 가지 (0) | 2022.04.09 |
[C/C++] 캐스팅연산자 (0) | 2022.04.08 |
[C/C++]STL 컨테이너 - std::map/std::set 그리고 std::deque (0) | 2022.04.08 |
[C/C++]STL 컨테이너 - std::vector 와 std::list (0) | 2022.04.08 |