45. std::string_view 의 내부 표현과 수명
난이도 중 해설 보기 →
결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커
(A)(B) 는 주목 위치 힌트다.
결함 코드 · C++
// [주제] std::string_view 의 내부 표현과 수명
//
// [과제]
// 1. 아래 프로그램의 각 출력 지점(A~E)에서 무엇이 출력되는지, 혹은 정의되지 않은 동작인지
// 예측하고 그 이유를 설명하시오.
// 2. std::string_view 가 내부적으로 무엇을 들고 있는지, 복사 비용이 왜 저렴한지 설명하시오.
// 3. C 함수(std::printf("%s"), ::strlen 등)에 string_view 를 넘길 때 무엇을 주의해야 하는지
// 설명하시오.
// 4. 함수의 매개변수 타입으로 string_view 를 쓰는 것이 적절한 경우와 부적절한 경우를
// 구분하고, 반환 타입으로 쓸 때의 위험을 설명하시오.
//
// 게임서버 맥락: 수신 패킷 버퍼에서 문자열 필드(닉네임, 채팅, 아이템 코드)를 복사 없이
// 잘라 쓰는 파서에서 이 타입이 자주 쓰인다.
#include <cstdio>
#include <cstring>
#include <string>
#include <string_view>
#include <vector>
std::string makeName(int id) {
return "player_" + std::to_string(id);
}
std::string_view firstToken(const std::string& s) {
auto pos = s.find(' ');
return std::string_view(s).substr(0, pos == std::string::npos ? s.size() : pos);
}
int main() {
std::printf("A: %zu\n", sizeof(std::string_view));
std::string chat = "hello world from zone";
std::string_view tok = firstToken(chat);
std::printf("B: %.*s (len=%zu)\n",
static_cast<int>(tok.size()), tok.data(), tok.size());
std::string_view danger = makeName(42);
std::printf("C: %.*s\n", static_cast<int>(danger.size()), danger.data());
// 패킷 버퍼에서 널 종료 없이 잘라낸 필드
const char packet[] = {'s','w','o','r','d','_','0','1','X','Y','Z'};
std::string_view field(packet, 8);
std::printf("D: %.*s / strlen-style=%zu\n",
static_cast<int>(field.size()), field.data(), std::strlen(field.data()));
std::string owner = "guild_master";
std::string_view sv = owner;
owner += "_of_the_north";
std::printf("E: %.*s\n", static_cast<int>(sv.size()), sv.data());
return 0;
} 내 리뷰 · C++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.