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

값으로 전달하는 것이 참조로 전달하는 것보다 항상 느린가요? \'속도를 원하십니까? 가치에 의한 전달\' 논쟁의 포장 풀기

Barbara Streisand
풀어 주다: 2024-10-26 10:45:02
원래의
944명이 탐색했습니다.

 Is Passing by Value Always Slower Than Passing by Reference? Unpacking the

"속도를 원하십니까? 가치로 전달": 자세한 설명

"속도를 원하십니까? 가치로 전달"이라는 개념이 논의를 불러일으켰습니다. 프로그래밍 커뮤니티에서. 이 문서에서는 값 대 참조로 인수를 전달할 때 성능에 미치는 영향을 자세히 알아보고 값으로 전달하여 속도를 높일 수 있는 상황을 조명합니다.

X 및 Y 구조를 묘사하는 다음 코드 조각을 고려하세요.

<code class="cpp">struct X {
    std::string mem_name;

    X(std::string name)
        : mem_name(std::move(name)) {}
};

struct Y {
    std::string mem_name;

    Y(const std::string &amp;name)
        : mem_name(name) {}
};</code>
로그인 후 복사

X의 생성자에서 "name" 인수가 복사된 후 "mem_name"으로 이동됩니다. Y의 생성자에서 "name"은 const 참조이므로 초기 복사본이 필요하지 않습니다. 한 번의 복사 작업만으로 Y의 접근 방식이 더 효율적으로 보일 수 있습니다.

그러나 "속도를 원하십니까? 값으로 전달"이라는 개념은 일부 시나리오에서는 복사를 생략할 수 있음을 강조합니다. 다음 코드를 고려하십시오.

<code class="cpp">std::string foo() { return "a" + std::string("b"); }

int main() {
    X(foo());
    Y(foo());
}</code>
로그인 후 복사

이 경우 X는 "name" 객체의 공간에 직접 foo()의 반환 값을 구성할 수 있으므로 추가 복사본이 필요하지 않습니다. 그러나 Y는 임시 반환 값을 "mem_name"에 복사해야 합니다. 따라서 rvalue 인수의 경우 값으로 전달(이 경우 X를 통해)하면 잠재적으로 단일 이동 작업이 발생할 수 있는 반면, 참조로 전달(Y를 통해)에는 불가피한 복사가 포함됩니다.

요약:

  • lvalue 인수의 경우 X와 Y 모두 한 번의 복사 작업을 수행합니다.
  • rvalue 인수의 경우 X는 잠재적으로 단일 이동 작업을 수행할 수 있지만 Y는 항상 복사를 수행해야 합니다.

참조로 전달하는 것은 일반적으로 포인터를 전달하는 것으로 해석되지만 이동 작업은 포인터를 전달하는 것보다 작업적으로 더 빠를 수 있습니다. 따라서 값을 전달하면(어떤 경우에는) 불필요한 복사를 방지하고 성능을 향상시킬 수 있습니다.

이러한 지침은 절대적인 것이 아니며 신중하게 해석해야 한다는 점에 유의하는 것이 중요합니다. 의심스러운 경우 특정 시나리오에 대한 실제 성능 영향을 확인하기 위해 프로파일링을 수행하는 것이 좋습니다.

위 내용은 값으로 전달하는 것이 참조로 전달하는 것보다 항상 느린가요? \'속도를 원하십니까? 가치에 의한 전달\' 논쟁의 포장 풀기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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