>백엔드 개발 >C++ >여전히 std::string을 const &로 전달해야 할까요?

여전히 std::string을 const &로 전달해야 할까요?

DDD
DDD원래의
2024-12-12 14:27:14932검색

Should We Still Pass std::string by const &?

Const Std::string & 매개변수의 과거 시대

최근 토론에서 Herb Sutter는 const & 매개변수로 std::Vector 및 std::string을 전달하면 더 이상 동일한 가중치를 유지할 수 없습니다. 이러한 객체를 가치로 전달하는 그가 제안한 대안은 논쟁을 촉발하고 질문을 제기했습니다.

전환의 이해

Sutter가 이러한 변화를 옹호한 이유는 무엇입니까? 주된 이유는 아래 설명된 것과 유사한 시나리오에 있습니다.

함수 B를 호출하고 함수 B가 다시 함수 C를 호출하는 함수 A를 생각해 보세요. 함수 A는 문자열을 B를 거쳐 C로 전달하며, 이를 인식하지 못합니다. C의 존재.

Const & Approach:

B와 C가 문자열을 다음과 같이 수신할 때 const 및 매개변수의 경우 상호 작용은 다음과 같이 발생합니다.

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

void C(const std::string &str) {
  // Manipulates `str` but does not store it.
}

이 접근 방식은 포인터를 효과적으로 순환시켜 불필요한 복사나 이동을 방지합니다. C는 문자열을 저장하지 않고 사용하기만 하므로 const &를 허용합니다.

값 접근 방식:

그러나 C의 기능에서 문자열을 저장해야 하는 경우 , 다음과 같이 수정됩니다.

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

보시다시피 C는 더 이상 단순히 문자열을 사용하지 않고 저장도 합니다. C 11의 이동 의미론은 이론적으로 불필요한 복사를 제거해야 하지만 C의 const & 매개변수는 이를 방지합니다. 복사 생성자와 잠재적인 메모리 할당이 대신 작동합니다.

Const &:

const & 매개변수를 우회하고 모든 함수를 통해 문자열을 값으로 전달하면 이 문제가 제거됩니다. 문제. std::move는 필요한 경우 데이터를 효율적으로 섞을 수 있습니다. 함수가 문자열을 유지하려는 경우 그렇게 할 수 있습니다.

성능 고려 사항:

값으로 전달하면 참조를 사용할 때보다 성능 비용이 더 높아집니다. 그러나 SSO의 혜택을 받는 작은 문자열의 경우 비용은 미미합니다.

결론

std::string을 const & 또는 값으로 전달할지 여부는 다음에 따라 결정됩니다. 특정 사용 사례와 메모리 할당에 대한 민감도. 값 전달은 보편적으로 바람직하지 않을 수 있지만 특정 상황에서는 강력한 이점을 제공합니다.

위 내용은 여전히 std::string을 const &로 전달해야 할까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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