>백엔드 개발 >C++ >`const std::string&`으로 `std::string`을 전달하는 것이 현대 C에서 여전히 유익합니까?

`const std::string&`으로 `std::string`을 전달하는 것이 현대 C에서 여전히 유익합니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-22 05:38:14689검색

Is Passing `std::string` by `const std::string&` Still Beneficial in Modern C  ?

Const std::string을 매개변수로 전달하면 더 이상 이점이 있나요?

최근 강연에서 저명한 C 전문가 Herb Sutter가 제안했습니다. std::Vector 및 std::string을 const &로 전달하는 인수는 더 이상 설득력이 없습니다. 설명을 위해 그는 다음과 같이 작성된 함수를 제안했습니다.

std::string do_something ( std::string inval )
{
   std::string return_val;
   // ... do stuff ...
   return return_val;
}

Herb는 return_val이 함수 반환 시 rvalue가 되므로 비용 효율적인 이동 의미 체계를 사용하여 반환될 수 있다고 추론했습니다. 그러나 질문은 여전히 ​​남아 있습니다. 입력 매개변수 inval을 참조로 전달하는 이유는 무엇입니까? std::string 객체의 더 큰 크기(힙 포인터 및 char 배열과 같은 구성 요소로 인해)가 값 전달에 더 유리하지 않나요?

Herb의 이론적 근거

Herb의 제안은 여러 중첩 함수가 관련된 시나리오에서 비롯됩니다. 함수 A가 함수 B를 호출하고 함수 B가 함수 C를 호출하며 각각 문자열 매개변수를 전달하는 상황을 생각해 보세요. B와 C가 문자열을 const &로 사용하는 경우 코드는 다음과 같습니다.

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

void C(const std::string & str) {
  // Use `str` without storing it.
}

이 접근 방식은 포인터를 효율적으로 전달하여 복사나 이동을 방지합니다. C는 문자열을 저장하지 않기 때문에 const &를 사용합니다.

그러나 이제 C가 문자열을 저장해야 한다고 가정해 보겠습니다. C를 다음과 같이 수정하면 B가 해당 매개변수에 복사를 수행하게 되어 모든 이점이 무효화됩니다.

void C(const std::string & str) {
  // ...
  m_str = str;
}

반대로, str이 std::move에 의존하여 모든 함수 전반에 걸쳐 값으로 전달된 경우 데이터 이동을 처리하면 C는 단순히 임시 문자열의 소유권을 수락할 수 있으므로 복사본이 필요하지 않습니다.

비용 고려사항

값으로 전달하면 참조를 사용하는 것에 비해 약간의 성능 저하가 발생하지만 SSO를 사용하여 작은 문자열을 복사하는 비용과 비슷할 수 있습니다. 이러한 접근 방식 중 선택은 메모리 할당 빈도와 특정 사용 사례에 따라 달라집니다.

위 내용은 `const std::string&`으로 `std::string`을 전달하는 것이 현대 C에서 여전히 유익합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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