최근에 c++로 코딩을 하다가 문득 이런 의문이 들었다.
'클래스의 멤버 변수로 포인터를 쓰는게 좋은 걸까?'
그래서 Stack OverFlow를 통해 공부를 좀 한 후에
장단점을 정리한다.
- 장점
- 원하는 시점에 멤버변수 초기화 가능(때에 따라 아예 초기화 안해서 메모리 절약도 가능)
- 빌드 시간을 줄이는 Pimpl idiom기법 사용가능
- 데이터 해제를 원하는 시점에 할 수 있음
- 다형성을 사용할 수 있음
- 같은 class의 여러개의 Instance를 생성한다고 할 때(ex/오크 20마리), 모든 Instance가 공유하는 자원을 하나만 할당하고(ex/ 오크 초상화 텍스처) 각 Instance의 포인터가 해당 자원을 가리키는 방향으로 메모리 절약 가능
- 멤버 변수가 가리키는 데이터의 빠른 교체 가능(포인터 몇비트만 바꿔주면 되므로)- 단점
- 포인터 멤버 변수는 각각 heap영역에 동적할당 되므로 기본 데이터 타입 대비 Cache hit율 하락(성능 저하)
- 포인터 멤버 변수의 생존 주기가 클래스 instance의 생존주기와 달라지게 되므로 사용시 null 에러가 발생 할 수있음
- 동적할당된 포인터 멤버 변수의 데이터의 메모리 해제를 신경써야함(스마트 포인터는 해당없음)
- 복사생성자로 인한 Dangling Pointer이슈를 철저히 관리해야함
이 외에도 장단점이 정말 많을 것으로 생각되지만, 일단 생각나는게 이정도라 이정도만 적어본다.
공부해보고 느낀점은 Pointer멤버 변수는 많은 장점이 있지만(물론 성능이 나빠질 가능성도 있지만(다형성,Cache hit)), 프로그래머가 추가로 처리해줘야 되는 일들이 많이 생기게 되는 것 같다.
포인터 멤버변수는 장단점을 고려해서 해당 멤버변수가 포인터야 할 이유가 있을때만 사용하자!