작성
·
334
3
안녕하세요 선생님
수업 시간에 나온 noexcept 키워드에 대해서 질문 드립니다.
면접을 대비해서 c++을 정리하다가
해당 키워드도 나올 것 같아서 면접대비 리스트에
추가 하려 하는데요
구글에서 찾아보니까
vector에 대한 예시가 나오더라구요
선생님께서 수업시간에 벡터에대해서 설명하실때
size와 capacity 값이 동일하다면 메모리 바로 뒷공간에
무언가 메모리가 할당되어있어서 더이상 푸쉬 백을 할 수 없다
따라서 다른 메모리 공간을 컴파일러에 따라 차이가 있지만
size값에 1.2 ~1.5배 정도 할당을 해주고
기존에 벡터들을 복사나 이동을 시키고 원래있던 벡터를
소멸시킨다라고 하셨는데
블로그에서 이때 값 복사를 하게되면 성능 저하가 발생하니
이동생성자를 두어서 값 복사가 아닌 이동으로 성능 저하를
막는다. 하지만 이때 컴파일러는 예외가 발생하지 않을까 판단
을해서 이동이 아닌 값 복사를해서 복사생성자를 호출한다
따라서 이런 상황을 방지하고자 noexept를 명시적으로
두어 컴파일러에게 예외가 발생하지 않는다는 것을 알림으로
서 이동생성자가 호출되고 이동이 된다가 결론인거 같은데
여기서 질문이 예외가 발생한다는게 어떤 상황인지 모르겠습
니다. 검색해봐도 무슨말인지 잘 모르겠고 명확하게 설명이 안
되어 있어서 수업시간에 키워드가 나온김에 질문하려 합니다.
감사합니다.
답변 1
7
거의 다 제대로 이해하셨는데
예외가 발생하는 상황이 아리달송하신 것 같네요 ㅎㅎㅎ
여기서 예외라 함은 정말 예기치 못한 상황에 의해
(try- catch에 걸리는 온갖) 예외가 발생하는 것을 얘기하는겁니다.
예를 들어 동적할당 new 를 할 때도,
항상 100% 성공할 것이라고 생각할 수도 있지만
정말 극한의 상황에서 남은 메모리가 부족하면 실패할 수도 있고
그러면 할당 실패 예외가 발생할겁니다.
마찬가지로 실수로 정수 / 정수 나누기를 하는데 0 나누기를 해도 예외가 발생하겠죠.
이 예외를 우리가 명시적으로 try-catch로 받아주지 않으면 크래시가 날테니,
[사실상 크래시 나는 상황]을 예외라고 생각하시면 됩니다.
물론 게임이라면 이 경우에 그냥 크래시를 내고 원인을 분석하는 쪽으로 구현을 하지만
경우에 따라 try - catch 로 예외를 임시 땜빵하고 넘어가는 프로그램도 존재할 수 있습니다.
결과적으로 그런 프로그램이 아니라면
이리 저리 다 noexcept를 도배해서
컴파일러가 효율적인 코드를 만들 수 있게 유도하는 것이 바람직하겠죠.
(이론상 그렇긴 한데, 실제로 현업에서 noexcept를 열심히 사용하는 본 적은 '아직' 없습니다..)