> 백엔드 개발 > C++ > 본문

C 11 표준 라이브러리 기능의 자체 이동 할당이 보장됩니까?

DDD
풀어 주다: 2024-11-09 21:27:02
원래의
275명이 탐색했습니다.

Does Self-Move Assignment In C  11 Standard Library Functions Have Any Guarantees?

C 11 표준 라이브러리의 자체 이동 할당

C 11 표준은 특히 표준과 관련하여 자체 이동 할당과 관련된 다양한 조항을 포함합니다. 도서관. 이 기사에서는 라이브러리 함수에서 자체 이동 할당의 의미에 초점을 맞춰 이러한 조항을 설명합니다.

구체적으로 표준은 표준 라이브러리 함수의 인수가 rvalue 참조 매개변수일 때 구현이 독점성을 가정할 수 있음을 보장합니다. . 이는 전달된 객체가 함수에 의해 수정되지 않는다는 이해를 바탕으로 구현이 코드를 최적화할 수 있음을 의미합니다.

자체 이동 할당의 맥락에서 이 보장은 주목할만한 영향을 미칩니다. 예를 들어 다음 함수를 고려해 보세요.

template<class T>
std::vector<T> selfAssign(std::vector<T> v) {
  v = std::move(v);
  return v;
}
로그인 후 복사

lvalue가 전달되면 벡터의 복사 생성자가 호출되어 입력 벡터의 복사본이 생성됩니다. 그러나 표준 라이브러리 보장으로 인해 벡터의 이동 할당 연산자 구현에서는 해당 인수가 prvalue라고 가정할 수 있습니다. 따라서 자체 이동 할당은 불가능하며 함수의 동작은 구현에 따라 달라집니다.

대부분의 경우 자체 이동 할당은 원래 벡터를 리소스가 없는 상태(용량 0)로 둡니다. . 벡터의 용량이 이미 0인 경우 작업은 작동하지 않습니다. 그러나 자체 이동 할당 후에는 원래 벡터와 이동된 벡터의 상태가 모두 지정되지 않는다는 점에 유의하는 것이 중요합니다.

Working Draft N4618의 표준에 대한 최근 업데이트에서는 MoveAssignable에 이를 지정하여 이러한 조항을 더욱 명확하게 했습니다. rvalue(rv)가 표현식(t)에 할당되는 요구 사항에서는 t와 rv가 동일한 개체를 참조하지 않는 경우 t는 할당 전에 rv 값만 얻으면 됩니다. 이 조건에 관계없이 할당 후 rv의 상태는 지정되지 않은 상태로 유지됩니다.

또한 t와 rv가 동일한 객체를 참조하는지 여부에 관계없이 rv는 이를 활용하는 라이브러리 구성 요소의 요구 사항을 준수해야 한다는 점을 강조합니다.

위 내용은 C 11 표준 라이브러리 기능의 자체 이동 할당이 보장됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿