>  기사  >  백엔드 개발  >  \"속도를 원하십니까? 값에 의한 전달\"은 항상 사실입니다. 참조에 의한 전달이 값에 의한 전달보다 성능이 뛰어난 경우는 언제입니까?

\"속도를 원하십니까? 값에 의한 전달\"은 항상 사실입니다. 참조에 의한 전달이 값에 의한 전달보다 성능이 뛰어난 경우는 언제입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-26 17:09:03715검색

Is

"속도를 원하시나요? 가치를 무시하세요" 및 성능 최적화

복사량이 많은 작업을 처리할 때 개발자는 성능 최적화를 위해 노력하는 경우가 많습니다. 이 전제는 Scott Meyers가 만든 "속도를 원하십니까? 가치에 따라 전달하십시오"라는 격언으로 이어졌습니다. 그러나 이 개념은 다음과 같은 질문을 제기합니다. 값으로 전달하는 것이 참조로 전달하는 것보다 항상 성능상의 이점을 제공합니까?

다음 클래스 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& name) : mem_name(name) {}
};</code>

X에서 생성자는 인수의 복사본을 취하고 이동 생성자를 사용하여 멤버 변수 mem_name을 초기화합니다. Y에서 생성자는 const 참조를 취하고 인수에서 직접 mem_name을 초기화합니다.

이제 이러한 클래스를 활용하는 시나리오를 살펴보겠습니다.

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

int main() {
    X(foo());
    Y(foo());
}</code>

foo() 함수는 X에서 name을 초기화하고 Y에서 mem_name을 초기화하는 데 사용되는 임시 값입니다.

X의 경우 컴파일러는 foo()의 구성을 최적화하고 반환 값을 name에 직접 배치할 수 있습니다. 그런 다음 name을 mem_name으로 이동합니다. 이 프로세스는 사본 없이 단일 이동으로 이어집니다.

반면 Y는 이 최적화를 수행할 수 없습니다. foo()의 임시 반환 값을 참조 이름에 바인딩한 다음 해당 값을 mem_name에 복사합니다. 따라서 Y는 복사를 수행합니다.

요약하면 rvalue(임시 개체)를 전달할 때 X에 값을 전달하면 프로세스를 단일 이동으로 최적화할 수 있는 잠재력이 있는 반면, Y에 참조로 전달하려면 복사. 그러나 이러한 최적화는 컴파일러 기능에 따라 달라지며 실제 성능에 미치는 영향을 확인하려면 항상 프로파일링을 수행하는 것이 좋습니다.

위 내용은 \"속도를 원하십니까? 값에 의한 전달\"은 항상 사실입니다. 참조에 의한 전달이 값에 의한 전달보다 성능이 뛰어난 경우는 언제입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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