인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

유영재님의 프로필 이미지
유영재

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

전달 참조 (forwarding reference)

noexept 키워드에 대해서 질문드립니다.

작성

·

334

3

안녕하세요 선생님

수업 시간에 나온 noexcept 키워드에 대해서 질문 드립니다.

면접을 대비해서 c++을 정리하다가

해당 키워드도 나올 것 같아서 면접대비 리스트에

추가 하려 하는데요

구글에서 찾아보니까 

vector에 대한 예시가 나오더라구요

선생님께서 수업시간에 벡터에대해서 설명하실때

size와 capacity 값이 동일하다면 메모리 바로 뒷공간에

무언가 메모리가 할당되어있어서 더이상 푸쉬 백을 할 수 없다

따라서 다른 메모리 공간을 컴파일러에 따라 차이가 있지만

size값에 1.2 ~1.5배 정도 할당을 해주고 

기존에 벡터들을 복사나 이동을 시키고 원래있던 벡터를

소멸시킨다라고 하셨는데

블로그에서 이때 값 복사를 하게되면 성능 저하가 발생하니

 이동생성자를 두어서 값 복사가 아닌 이동으로 성능 저하를

막는다. 하지만 이때 컴파일러는 예외가 발생하지 않을까 판단

을해서 이동이 아닌 값 복사를해서 복사생성자를 호출한다

따라서 이런 상황을 방지하고자 noexept를 명시적으로

두어 컴파일러에게 예외가 발생하지 않는다는 것을 알림으로

서 이동생성자가 호출되고 이동이 된다가 결론인거 같은데

여기서 질문이 예외가 발생한다는게 어떤 상황인지 모르겠습

니다. 검색해봐도 무슨말인지 잘 모르겠고 명확하게 설명이 안

되어 있어서 수업시간에 키워드가 나온김에 질문하려 합니다.

감사합니다.

답변 1

7

Rookiss님의 프로필 이미지
Rookiss
지식공유자

거의 다 제대로 이해하셨는데
예외가 발생하는 상황이 아리달송하신 것 같네요 ㅎㅎㅎ

여기서 예외라 함은 정말 예기치 못한 상황에 의해
(try- catch에 걸리는 온갖) 예외가 발생하는 것을 얘기하는겁니다.
예를 들어 동적할당 new 를 할 때도,
항상 100% 성공할 것이라고 생각할 수도 있지만
정말 극한의 상황에서 남은 메모리가 부족하면 실패할 수도 있고
그러면 할당 실패 예외가 발생할겁니다.
마찬가지로 실수로 정수 / 정수 나누기를 하는데 0 나누기를 해도 예외가 발생하겠죠.
이 예외를 우리가 명시적으로 try-catch로 받아주지 않으면 크래시가 날테니,
[사실상 크래시 나는 상황]을 예외라고 생각하시면 됩니다.
물론 게임이라면 이 경우에 그냥 크래시를 내고 원인을 분석하는 쪽으로 구현을 하지만
경우에 따라 try - catch 로 예외를 임시 땜빵하고 넘어가는 프로그램도 존재할 수 있습니다.

결과적으로 그런 프로그램이 아니라면
이리 저리 다 noexcept를 도배해서
컴파일러가 효율적인 코드를 만들 수 있게 유도하는 것이 바람직하겠죠.
(이론상 그렇긴 한데, 실제로 현업에서 noexcept를 열심히 사용하는 본 적은 '아직' 없습니다..)

유영재님의 프로필 이미지
유영재

작성한 질문수

질문하기