C++ 타입에 이동 생성자가 있는데 vector 확장 시 복사가 일어납니다. noexcept는 어떤 선택에 영향을 주나요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
컨테이너는 재할당 중 예외가 나도 보장할 상태를 고려해 복사와 이동을 선택할 수 있습니다. 이동이 예외를 던질 수 있고 복사가 가능한 타입이면 강한 예외 보장을 위해 복사를 택하는 경우가 있습니다.
동작 원리와 전제
이동 중 일부 원소만 원본에서 자원을 가져간 뒤 실패하면 옛 vector를 원래대로 유지하기 어렵습니다. 복사는 원본을 보존하기 쉬워 rollback에 유리할 수 있습니다. 실제 선택은 타입 trait과 컨테이너·표준 계약을 확인합니다.
선택과 실패 처리
noexcept를 무조건 붙이면 실제 예외가 나왔을 때 terminate로 이어질 수 있습니다. 진짜 던지지 않는 구현인지 확인하고, 자원 획득·할당이 들어가는 이동은 그 가능성을 검토합니다. move가 있다고 항상 상수 시간이라는 보장도 없습니다.
구체적인 사례와 검증
일반적인 vector의 성장 시 원소 복사·이동 선택을 확인하려면 생성자에 관찰용 카운터를 두고 reserve 경계를 넘는 작은 시험을 만들 수 있습니다. 그러나 관찰 결과 하나를 모든 표준 라이브러리와 타입에 일반화하지 않고 요구되는 예외 보장과 trait을 함께 봅니다. 이동 생성자에서 메모리를 새로 할당한다면 실패 가능성이 있을 수 있어 noexcept 선언의 정당성을 확인합니다. 예외를 던질 수 없는 구현으로 바꾸는 것과 선언만 붙이는 것은 다릅니다. 성능 튜닝은 정상 경로의 복사 수뿐 아니라 실패 때 객체·컨테이너가 어떤 유효 상태로 남는지도 검증해야 합니다.
용량 확장·복사 가능 여부·던지는 이동·컨테이너 예외 경로를 시험합니다. 최적화를 위해 안전 보장을 거짓으로 선언하지 않습니다. 성능과 예외 시 상태 보존을 같이 설명해야 std::move 하나로 모든 복사가 사라진다는 오해를 피할 수 있습니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- 핵심 구분: 컨테이너는 재할당 중 예외가 나도 보장할 상태를 고려해 복사와 이동을 선택할 수 있습니다.
- 선택 조건: noexcept를 무조건 붙이면 실제 예외가 나왔을 때 terminate로 이어질 수 있습니다.
- 검증 기준: 용량 확장·복사 가능 여부·던지는 이동·컨테이너 예외 경로를 시험합니다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- 복사를 줄이려면 실제 구현과 무관하게 모든 이동 생성자에 noexcept를 붙이면 된다고 한다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- 이동 요청을 했는데 복사가 선택되거나 원본 상태가 바뀌는 조건은 무엇인가요?
- 자원을 자동 해제해도 예외 전의 데이터 상태가 복원되는지는 어떤 보장으로 구분하나요?
- 컨테이너 변경 뒤 포인터·iterator가 같은 논리 객체를 계속 가리키는지 어떻게 확인하나요?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.
원리부터 공부하고 싶다면
답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.