"속도를 원하시나요? 가치를 무시하세요" 및 성능 최적화
복사량이 많은 작업을 처리할 때 개발자는 성능 최적화를 위해 노력하는 경우가 많습니다. 이 전제는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!