> 백엔드 개발 > C++ > 값 또는 상수 참조로 `std::string` 및 `std::Vector`를 전달해야 합니까?

값 또는 상수 참조로 `std::string` 및 `std::Vector`를 전달해야 합니까?

Susan Sarandon
풀어 주다: 2024-12-29 00:22:10
원래의
736명이 탐색했습니다.

Should You Pass `std::string` and `std::vector` by Value or Const Reference?

값으로 매개변수 전달: const std::string &

Herb Sutter는 최근 std::Vector 및 const 참조에 의한 std::string 객체. 그는 다음 코드에서 볼 수 있듯이 많은 경우 값으로 전달하는 것이 더 바람직하다고 제안합니다.

std::string do_something(std::string inval) {
  std::string return_val;
  // ... do stuff ...
  return return_val;
}
로그인 후 복사

반환 값은 함수 반환 시점에서 rvalue이고 이동할 수 있습니다. 사실상 Sutter의 진술에 대한 이론적 근거는 다음과 같은 경우에 있습니다.

함수 B를 호출하고 함수 B를 호출하는 함수 A를 생각해 보세요. A는 문자열 매개변수를 다음에 전달합니다. B는 이를 C에 전달합니다. A는 C에 대해 직접적인 지식이 없습니다.

B와 C가 const 참조로 문자열을 취하는 경우 코드는 다음과 같습니다.

void B(const std::string &str) {
  C(str);
}

void C(const std::string &str) {
  // Process `str` without storing it.
}
로그인 후 복사

이 접근 방식은 포인터를 전달하고 수신하는 것으로 충분하므로 복사나 이동 비용이 많이 들지 않습니다.

그러나 C가 포인터를 저장해야 하는 경우 string:

void C(const std::string &str) {
  // Process `str`.
  m_str = str;
}
로그인 후 복사

이렇게 하면 복사 생성자와 잠재적인 메모리 할당이 트리거됩니다(짧은 문자열 최적화 무시). C 11의 이동 의미론은 불필요한 복사를 제거하는 것을 목표로 하지만 A가 임시 문자열을 전달함에도 불구하고 C는 const 참조를 취하여 이를 방지합니다.

반대로, str이 모든 함수를 통해 값으로 전달된 경우 이동 의미론에 의존하여 전송합니다. 소유권이 있는 경우 C는 복사 작업을 수행하지 않고 데이터를 채택하거나 삭제할 수 있습니다. 이 접근 방식에는 약간의 성능 오버헤드가 있지만 메모리 할당이 없으므로 특정 사용 사례에 따라 유리할 수 있습니다.

위 내용은 값 또는 상수 참조로 `std::string` 및 `std::Vector`를 전달해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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