> 백엔드 개발 > C++ > 속도를 원하시나요? 가치에 의한 전달: 복사 제거가 항상 성능 승자인가?

속도를 원하시나요? 가치에 의한 전달: 복사 제거가 항상 성능 승자인가?

Linda Hamilton
풀어 주다: 2024-10-26 11:59:03
원래의
1070명이 탐색했습니다.

 Want Speed? Pass By Value: Is Copy Elision Always the Performance Winner?

속도를 원하시나요? 값에 의한 전달: 성능 고려 사항

"속도를 원하십니까? 값에 의한 전달" 원칙은 값에 의한 인수 전달이 때때로 복사 제거로 인해 성능을 향상시킬 수 있음을 시사합니다. 설명을 위해 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) {}
};

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

여기서 foo()는 X 및 Y 생성자 모두에 전달되는 임시 문자열을 반환합니다. X가 mem_name을 초기화할 때 std::string의 이동 생성자를 호출하여 잠재적으로 문자열 복사를 방지합니다. 그러나 Y가 mem_name을 초기화할 때 문자열 참조를 복사해야 합니다.

Lvalue 대 Rvalue 인수:

lvalue(비임시)가 전달되면 두 X 모두 Y는 복사를 수행합니다. 또한 X는 이동을 수행합니다. rvalue(임시)의 경우 X는 이동만 수행할 수 있지만 Y는 복사를 수행해야 합니다.

성능에 미치는 영향:

일반적으로 이동은 전달보다 빠릅니다. 포인터(참조로 전달하는 것과 동일) 따라서 X는 lvalue에 대해 Y와 비슷한 성능을 갖고 rvalue에 대해 더 나은 성능을 갖습니다.

주의:

"속도를 원하십니까? 값을 전달하세요"는 설득력 있는 아이디어이지만, 그것은 현명하게 적용되어야 한다. 대규모 데이터 구조 복사와 관련된 특정 컨텍스트 및 잠재적인 오버헤드를 고려하는 것이 중요합니다. 실제 성능 영향을 확인하려면 프로파일링을 권장합니다.

추가 리소스:

  • [Scott Meyer의 GN13 Talk](https://www.youtube.com /watch?v=uk3-zmJWt-E) (시간대 8:10 및 8:56)
  • [juanchopanza의 블로그: "속도를 원하십니까? (항상) 가치를 전달하지 마십시오"]

위 내용은 속도를 원하시나요? 가치에 의한 전달: 복사 제거가 항상 성능 승자인가?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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