728x90
반응형

C++ 뷰(View) 타입과 소유(Ownership) 타입


1. 소유 타입 (Owning Types)

  • 소유 타입 은 해당 객체가 자원의 소유권 을 가지고 있어, 수명 관리(생성/소멸) 를 책임집니다.
  • 이 타입은 객체가 소멸될 때 자동으로 해당 자원을 해제합니다.

1.1. 대표적인 소유 타입:

  • std::vector<T>
  • std::string
  • std::unique_ptr<T>
  • std::shared_ptr<T>
  • std::list<T> 등 STL 컨테이너 대부분

  • cpp

      std::vector<int> data = {1, 2, 3};  // data가 메모리의 소유권을 가짐
    


2. 뷰 타입 (View Types)

  • 뷰 타입은 자원을 소유하지 않고 참조만 하는 타입입니다.
  • 즉, 자원의 소유권은 다른 객체가 가지고 있으며, 해당 데이터가 존재하는 동안만 유효합니다.

2.1. 대표적인 뷰 타입:

  • T*, const T* → 일반 포인터
  • std::string_view (C++17) → 문자열 뷰
  • std::span<T> (C++20) → 범위 참조
  • std::ranges::subrange (C++20)
  • std::array_view (C++ 비표준)

  • cpp

      #include <string_view>
      #include <iostream>
    
      void print(std::string_view sv) {
         // std::string_view는 std::string이나 char*로부터 
         // 문자열을 얕게 참조하고, 소유하지 않습니다.
      
          std::cout << sv << '\n';
      }
    
      int main() {
          std::string str = "Hello, World!";
          print(str);                    // std::string
          print("Temporary literal");    // const char*
      }
    


3. 소유 타입 vs 뷰 타입 요약 비교

  • 구분 소유 타입 (vector, unique_ptr) 뷰 타입 (span, string_view)
    소유권 O X
    생명주기 관리 직접 관리 외부 자원에 의존
    복사 비용 깊은 복사 (deep copy) 얕은 복사 (shallow copy)
    사용 용도 자원 생성 및 유지 읽기 전용, 임시 접근


4. 사용 시 주의사항 및 팁

  • 함수 파라미터 전달 시, 복사가 불필요하면 std::span 또는 std::string_view와 같은 뷰 타입을 사용하는 것이 성능상 유리 합니다.
  • 하지만 뷰 타입은 수명 관리에 주의 해야 합니다.
  • 참조 대상 객체가 먼저 소멸되면 댕글링 포인터(유효하지 않은 참조) 문제가 발생할 수 있습니다.



  • 도움이 되셨으면 하단의 ❤️ 공감 버튼 부탁 드립니다. 감사합니다! 😄

728x90
반응형

+ Recent posts