아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
팔팔한군함조253
팔팔한군함조25319.03.11

[C++프로그래밍]일반 포인터와 스마트 포인터 관련하여 질문 드립니다.

KLDP에 계신 여러분들은 일반 포인터와 스마트 포인터를 어떻게 보시는지 궁금합니다.
구글링을 해보면 스마트 포인터는 기존에 C#/Java같이 G.C의 혜택을 받았던 개발자들에게
메모리 해제라는 짐을 덜어준 것이라고 알고 있습니다.

하지만, 멀티 스레드 환경에서는 reference-counting 방식의 포인터는
생성, 복사, 파괴 과정에서 원자적이어야 하므로 퍼포먼스가 저해될 수 있다고도 알고 있습니다.

그런데, 스마트 포인터 자체가 일반 포인터에 비해 많이 무거운지라(정말 스마트 포인터가 일반 포인터에 비해 많이 무거운가요?) 일반 포인터를 사용하는 것을 선호한다는 얘기도 줏어들었습니다.

지금까지 알고 있는 지식을 취합해보면 싱글 스레드 기반에서는 스마트 포인터를 써도 크게 무리는 없겠지만 멀티 스레드에서는 일반 포인터를 쓰는 것이 좋다.
이정도로 정리가 되는데 C++ 에서의 자원 관리 및 성능에 있어서 고수님들은 어떤 포인터를 쓰고 왜 쓰는지 이야기를 듣고 싶습니다.

55글자 더 채워주세요.
답변의 개수
3개의 답변이 있어요!
  • 레퍼런스 카운팅 방식으로 오토 릴리즈를 제공해주는 것이 스마트 포인터 입니다.
    알고계신대로 멀티 쓰레드 환경에서 이 카운팅이 원자적이어야 하기 때문에 동기화 처리가 추가됩니다.
    이것 때문에 멀티쓰레드에서는 퍼포먼스가 (상대적으로) 떨어진다고 말하고 있습니다.

    편의성도 그렇고, 개발자의 실수 방지 때문에라도 스마트 포인터 쓰는게 권장됩니다.
    스마트 포인터 쓰세요

    싱글쓰레드 환경에서라면 그냥 쓰면 됩니다. 퍼포먼스 차이 없다고 봐도 됩니다.

    멀티쓰레드 환경이라면, 메모리 생성/해제가 빈번하게 일어나는지 확인해 보세요.
    매우 빈번하게 일어나고 있으면서 (게임이나 영상처리처럼) 실시간으로 빠른 고성능 처리를 해야 한다면
    일반 포인터를 쓰는 것을 고려해 보세요.
    실시간적 고성능이 필요한 경우가 아니라면 그냥 스마트 포인터 쓰세요.
    매우 빈번하게 메모리 생성/해제가 이뤄진다면 생성 후 재사용하도록 코드를 바꾸고 스마트 포인터 쓰세요.

    (결론) 스마트 포인터 쓰세요.


  • 많이 무겁지 않습니다. 실제 환경에서는 포인터 자체를 복사하는 작업은 그 횟수가 많지 않아 오버헤드가 거의 없다고 보셔도 됩니다.

    개인적으로 스마트 포인터의 사용을 많이 선호하는 편인데, 그 이유로는

    1) error handling path가 여럿이라도 자원 관리가 편하다.
    2) 자원을 해제하는 주체가 명확하지 않을 경우에도 사용이 편리하다.
    3) 여러 custom memory allocator를 이용할 경우에, 객체를 사용하는 주체가 어떤 할당자를 사용하여 해제해야하는지 알 필요가 없다.

    등이 있습니다.

    unique_ptr도 스마트 포인터로 치는지는 잘 모르겠는데 (별로 스마트하지는 않죠 -_-) 이 경우 컴파일러가 제대로만 해주면 그냥 포인터를 쓰는 것과 동일한 코드가 나와야 합니다. 즉 오버헤드는 전혀 없고, 실수로 memory leak을 만들 가능성을 대폭 줄여주는 아주 좋은 기능이죠.

    Reference counting을 하는 경우는 써본 적이 없어서 어쩔라나 잘 모르겠습니다. (분야에 따라 다르겠지만, 제 경우에는 클래스를 잘 설계하면 거의 모든 경우가 unique_ptr로 해결이 됩니다.)

    자바에서는 모든 인스턴스를 new로 생성하지만
    C++은 지역변수로 선언하면 스코프룰에 따라서 소멸합니다

    즉 C++에서 new(또는 스마트포인터)는 자바처럼 매번 쓰는게 아니라
    필요한 경우에 쓰는 것이기 때문에

    그러니까 C++에서 new를 자바처럼 사용한다는건
    C에서 모든 변수를 포인터로 선언해서 매번 malloc/free하는 것과 같은데
    그런 독특한 취향을 가지고 있지 않는 이상
    성능을 걱정할건 아니라고 봅니다

    필요하니까 쓰는 것입니다
    예를 들면 스마트포인터를 사용하지 않으면
    예외가 발생할때 메모리누수가 생길 수 있으니
    스마트포인터를 사용하여 방지한다거나 하는 경우 등이죠.


  • 안녕하세요. 고수는 아니지만 스마트포인터를 쓰고있는 입장이라 ...

    저 같은 경우에는 데이터 은닉에 스마트 포인터를 사용하고 있습니다. 스마트 포인터가 무겁다는 이야기는 들었지만, 실제 사용함에 있어서는 차이를 못 느꼈습니다. 물론 알아서 해제해 줘서 편한것도 있고요.

    내부 구현에 있어서는 거의 할당, 해제 하며 사용하고 있습니다. 주로 SSE, AVX 를 사용해서 구현해야 하기 때문에 일반 포인터로 할당하는 방식을 많이 이용합니다.

    만약 스마트 포인터로 위 작업이 가능하다면 바꿔서 성능 테스트는 해보고 싶지만... 왠지 속도가 느릴꺼 같은 느낌이 오네요