C++현대 C++

string_view와 span 기본

소유권 없이 문자열과 연속 메모리 구간을 가볍게 바라보는 `std::string_view`와 `std::span`의 핵심 감각을 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

cpp
void printName(std::string_view name) {
    std::cout << name << "\n";
}

void printScores(std::span<const int> scores) {
    for (int score : scores) {
        std::cout << score << " ";
    }
}

설명

  • std::string_viewstd::span은 데이터를 "소유"하지 않고 "바라보기만" 하는 타입입니다. 복사 비용을 줄이고 인터페이스를 유연하게 만들 때 특히 유용합니다.
  • string_view는 문자열 데이터를, span은 연속 메모리 구간을 가볍게 가리킵니다. std::string, 문자열 리터럴, std::vector, 배열과 잘 연결됩니다.
  • 핵심 장점은 함수 인터페이스가 더 일반적이고 효율적으로 바뀐다는 점입니다. 예를 들어 읽기 전용 문자열 인자로 const std::string& 대신 std::string_view를 받으면 입력 형태가 더 넓어집니다.
  • 하지만 이 둘은 non-owning view이기 때문에 원본 수명이 매우 중요합니다. 원본이 사라지면 view는 즉시 dangling 상태가 될 수 있습니다.
  • 그래서 이 타입들은 "복사를 줄이는 현대 C++ 인터페이스"의 상징이면서도, 동시에 "수명 관리 감각"을 더 엄격하게 요구하는 도구이기도 합니다.

빠른 정리

타입바라보는 대상소유권
std::string_view문자열없음
std::span<T>연속 메모리 구간없음
장점복사 감소, 유연한 함수 인자
핵심 위험원본 수명 종료 후 dangling

주의할 점

string_viewspan은 편하지만 원본 데이터를 소유하지 않습니다. 임시 객체나 이미 사라질 버퍼를 가리키게 두면 값은 멀쩡해 보여도 즉시 위험한 참조가 될 수 있습니다.

참고 링크

2 sources