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

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

Barbara Streisand
풀어 주다: 2024-10-26 17:09:03
원래의
713명이 탐색했습니다.

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

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