복사 제거는 특정 상황에서 추가(잠재적으로 비용이 많이 드는) 사본을 방지하기 위해 대부분의 컴파일러에서 구현하는 최적화입니다. 따라서 사용되지 않거나 부작용이 없는 개체를 생성하는 코드가 있는 경우
예
struct MyStruct { MyStruct() {} MyStruct(const MyStruct&) { std::cout << "Copied.\n"; } }; MyStruct f() { return MyStruct(); } int main() { std::cout << "Main\n"; MyStruct obj = f(); }
출력
컴파일러 및 설정에 따라 다음과 같은 출력을 얻을 수 있습니다. -
Main Main Copied Copied Main Copied
즉, 생성할 수 있는 개체가 예상보다 적으므로 특정 수의 생성자와 소멸자를 호출할 수 없습니다. 복사/이동 생성자 또는 소멸자 내부에 중요한 논리가 있어서는 안 됩니다. 호출되는 것에 의존할 수 없기 때문입니다.