기본 패턴
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_view와std::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_view나 span은 편하지만 원본 데이터를 소유하지 않습니다. 임시 객체나 이미 사라질 버퍼를 가리키게 두면
값은 멀쩡해 보여도 즉시 위험한 참조가 될 수 있습니다.
참고 링크
2 sources