>  기사  >  백엔드 개발  >  C의 Const 객체에서 이동할 수 있나요?

C의 Const 객체에서 이동할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-11-18 09:49:02644검색

Can You Move From a Const Object in C  ?

const 객체의 std::move 이해: 성능 함정 공개

C에서는 std::move 함수를 사용하여 객체의 소유권을 이전합니다. 그러나 일반적인 질문이 생깁니다. 왜 const 객체에서 std::move를 호출하는 것이 가능합니까? 이는 직관에 어긋나고 잠재적으로 위험하지 않습니까?

비결은 std::move(const_object)가 실제 이동을 수행하지 않는다는 사실에 있습니다. 대신 컴파일러에게 이동을 시도하도록 지시합니다. 클래스에 rvalue(이동 생성자)에 대한 const 참조를 허용하는 생성자가 없는 경우 컴파일러는 기본적으로 암시적 복사 생성자를 사용합니다.

다음 예를 고려하세요.

struct Cat {
   Cat(){}
   Cat(const Cat&amp;) {std::cout << "COPY";}
   Cat(Cat&amp;&amp;) {std::cout << "MOVE";}
};

int main() {
    const Cat cat;
    Cat cat2 = std::move(cat); // prints "COPY"
}

보시다시피 cat이 const 객체임에도 불구하고 컴파일러는 안전하게 cat2를 복사본으로 생성합니다. 이는 이 예에서는 const 객체에 사용할 수 있는 이동 생성자가 없기 때문입니다.

Scott Meyers가 "Effective Modern C"에서 강조한 잠재적 함정은 안정성 문제라기보다는 성능 문제입니다. 본질적으로 이동 생성자를 사용할 수 없을 때 const 객체에서 이동을 시도하면 복사 효율성이 떨어집니다.

std::move가 const 객체에서 작동하지 않도록 제한하는 것이 논리적으로 보일 수도 있지만, 다음과 같은 이유로 인해 간단한 해결책은 아닙니다.

  • 비상수 객체에 이동 생성자가 없을 가능성이 있기 때문에 의도하지 않은 모든 복사 사례를 방지할 수는 없습니다.
  • 대체 복사 생성자를 의도적으로 사용하는 일반 템플릿 코드를 방해합니다.
  • 이는 const 객체의 이동 생성자가 의도적으로 필요한 경우를 제한합니다.

위 내용은 C의 Const 객체에서 이동할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.