스마트 포인터의 과도한 레퍼런스 카운팅(Reference Counting)
C++에서는 객체의 메모리 관리를 위해 스마트 포인터를 필수적으로 사용해야 할 때가 있다.
덕분에 편리하게 메모리를 다룰 수 있지만 한가지 유의점이 있다.
스마트 포인터의 Reference Count가 Atomic 연산자로 구현되어 있다는 점이다.
Atomic 연산자는 가끔씩 호출하는 정도로는 시스템에 부하를 거의 주지 않지만, 과도하게 호출되면 시스템 전체에 심한 렉을 유발시키곤 한다.
Atomic 이란?
(* 서버 프로그래머가 꼭 알아야 할 Atomic 연산자(https://modoocode.com/271))
std::list<std::shared_ptr<AAA>> sampleList; for ( auto aaa : sampleList ) { … } |
"auto aaa" 여기서 문제가 발생한다.
for each 문에 auto 는 당연히 복사생성자를 호출.list의 size 만큼 레퍼런스 카운팅을 1 증가시키고 1 감소하는 작업을 반복적으로 하게된다.
이를 고치기 위한 방법은 아주 간단하다. &만 붙여주면 복사생성자가 호출이 없어지기 때문에 효율적인 코드로 바뀌게 된다.
for ( auto& aaa : sampleList ) { … } |
이처럼 문제점만 찾으면 보통 해결법은 어렵지 않은것이 대부분이다.
'개발 🛠💻 > C++, Modern C++' 카테고리의 다른 글
[전문가를 위한 C++] 11장 11.1.6 레퍼런스와 포인터의 선택 기준 (0) | 2023.04.09 |
---|---|
맨날 헷갈리는 volatile과 std::atomic (0) | 2022.11.07 |
STL 컨테이너별 시간 복잡도 (0) | 2022.08.05 |
[C++ 17] Fold Expressions (0) | 2022.08.05 |
C++ 특수 멤버 함수와 The rule of three five zero (3/5/0) (0) | 2022.07.25 |
댓글