-
함수는 대부분 noexcept(false)입니다. 절대 예외를 던지지 않는다면 noexcept 키워드를 통해서 설정할 수 있습니다. 함수가 절대 예외를 던지지 않는 경우 동작 중 실패하지 않으므로 실패했을 때의 값을 복원할 필요가 없기 때문에 스택을 준비하지 않아도 됩니다. run stack에서 unwindable state를 유지할 필요가 없습니다.
vector의 크기가 capacity와 같아진다면 저장 공간을 동적으로 추가 확보하며 기존 데이터를 새로운 저장 공간으로 옮깁니다. 이동 생성자가 정의되어 있는 경우 데이터를 이동하고 그렇지 않은 경우 복사 생성자를 통해 복사합니다. 이동 생성자는 만약 예외가 일어날 경우 원래 값으로 복구할 수가 없기 때문에(std::move 함수를 통해 rvalue로 만들었으므로), 예외가 발생하면 안 됩니다. 그래서 이동 생성자를 정의할 때 noexcept를 붙여야 합니다.
다음 코드에서 이동 생성자에 noexcept를 붙이지 않으면 오류를 일으키진 않지만 noexcept를 붙일 것을 경고로 알려주며 resize 과정에서 move 생성자를 호출하지 않습니다.
#include <iostream> #include <vector> using namespace std; class Person { public: Person() { _age = 0; cout << "default" << endl; } Person(int age) : _age(age) {} Person(const Person& rhs) { _age = rhs._age; cout << "copy" << endl; } Person(Person&& rhs) noexcept { _age = rhs._age; cout << "move" << endl; } private: int _age; }; int main() { vector<Person> persons; persons.reserve(10); for (int i = 0; i < 10; ++i) persons.push_back(Person((i + 1) * 10)); cout << "-----------------------------" << endl; persons.resize(20); cout << endl; }
출처>
'개발 > C·C++' 카테고리의 다른 글
RVO, NRVO (0) 2022.01.08 constexpr (0) 2022.01.06 객체 생성 시 const의 위치 차이 (0) 2022.01.04 get 함수를 const로 해야 하는 이유 (0) 2022.01.04 알아두면 좋을 개념 (0) 2022.01.03