함수에서 값으로 클래스의 개체를 반환할 때 암시적 이동 규칙이 적용됩니다. 플레이에. 이 규칙은 반환된 값을 보관하기 위해 임시 개체를 생성할 때 컴파일러의 동작을 제어합니다.
다음 코드 조각을 고려하세요.
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(const test& z) { printf("test(const test&z)\n"); } test(test&& s)noexcept { printf("test(test&& s)\n"); } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
출력 :
test() test(test&& s)
이 예에서 Some_thing 함수는 기본 생성자를 사용하여 생성된 테스트 클래스의 명명된 개체를 반환합니다. 컴파일러는 NRVO(명명된 반환 값 최적화)로 인해 복사본을 제거할 수 있으므로 기본 생성자 test()의 출력과 그 뒤에 암시적 이동 생성자 test(test&& s)가 표시됩니다.
이제 대신 복사 생성자를 사용하도록 Some_thing 함수를 수정해 보겠습니다.
<code class="cpp">class test { public: test(int y) { printf("test(int y)\n"); } test() { printf("test()\n"); } test(test& z) { printf("test(test&z)\n"); } test(test&& s)noexcept { printf("test(test&& s)\n"); // Deleted this constructor } test& operator=(test e) { printf("test& operator=(test e)\n"); return *this; } }; test Some_thing() { test i; return i; } int main() { Some_thing(); return 0; }</code>
출력:
test() test(test&z)
놀랍게도 이 코드도 컴파일하고 실행합니다. 이동 생성자가 정의되어 있지 않지만. 이는 암시적 이동 규칙이 i 표현식이 "이동 가능"인지 여부를 확인하기 때문입니다. 이 경우 i는 이동 가능한 지역 변수입니다. 따라서 컴파일러는 여전히 복사 작업을 생략할 수 있습니다.
암시적 이동 규칙은 객체를 값으로 반환할 때 트리거되며 다음 조건이 충족됩니다.
암시적 이동 규칙은 객체를 값으로 반환하는 효율적이고 간결한 방법을 제공합니다. 이는 코드를 최적화하고, 불필요한 복사를 줄이고, 성능을 향상시키는 데 도움이 됩니다. 그러나 제한 사항을 이해하고 적절한 고려 없이 사용할 경우 발생할 수 있는 잠재적인 문제를 인식하는 것이 중요합니다.
위 내용은 C에서 명명된 객체를 값으로 반환할 때 암시적 이동 규칙은 어떻게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!