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

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

Barbara Streisand
Barbara Streisand원래의
2024-10-26 10:45:02945검색

 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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