development

값 또는 참조로 std :: string 전달

big-blog 2020. 10. 26. 08:11
반응형

값 또는 참조로 std :: string 전달


중복 가능성 :
const std :: string & 매개 변수로 전달 된 날이 끝났습니까?

std::string이동 의미 체계가 지원되는 경우 값 또는 참조 (인라인되지 않은 함수)로 전달해야합니까 ? 그리고 작은 문자열 최적화 (SSO)를 사용한 구현은 어떻습니까?


문자열로 무엇을하는지에 따라 여러 답변이 있습니다.

1) 문자열을 ID로 사용 (수정되지 않음). const 참조로 전달하는 것이 아마도 여기에서 가장 좋은 생각 일 것입니다.(std::string const&)

2) 문자열을 수정하지만 호출자가 변경 사항을 보지 못하도록합니다. 값으로 전달하는 것이 좋습니다.(std::string)

3) 문자열을 수정하지만 호출자가 변경 사항을 확인하기를 원합니다. 참조로 전달하는 것이 좋습니다.(std::string &)

4) 문자열을 함수로 보내면 함수 호출자는 다시 문자열을 사용하지 않습니다. 이동 의미론을 사용 하는 것이 옵션 일 수 있습니다.(std::string &&)


C ++ 11에 대한이 답변을 확인하십시오 . 기본적으로 lvalue를 전달하면 rvalue 참조

에서 이 문서 :

void f1(String s) {
    vector<String> v;
    v.push_back(std::move(s));
}
void f2(const String &s) {
    vector<String> v;
    v.push_back(s);
}

"lvalue 인수의 경우 'f1'은 값에 의한 인수를 전달하기위한 추가 복사본이 하나있는 반면 'f2'에는 push_back을 호출하기위한 추가 복사본이 하나 있습니다. 따라서 차이가 없습니다. rvalue 인수의 경우 컴파일러는 임시 'String (L“”)'이고 임시를 'f1'또는 'f2'에 전달합니다. 'f2'는 인수가 임시 (rvalue) 일 때 move ctor를 활용할 수 있으므로 인수는 이제 'f1'과 'f2'에 대해 동일합니다. "

계속 : "이것은 C ++ 11에서 다음과 같은 경우 값별 전달 방식을 사용하여 더 나은 성능을 얻을 수 있음을 의미합니다.

  1. 매개 변수 유형은 이동 시맨틱을 지원합니다-모든 표준 라이브러리 구성 요소는 C ++ 11에서 수행합니다.
  2. 이동 생성자의 비용은 복사 생성자보다 훨씬 저렴합니다 (시간 및 스택 사용량 모두).
  3. 함수 내에서 매개 변수 유형은 복사와 이동을 모두 지원하는 다른 함수 또는 작업에 전달됩니다.
  4. 임시 인수를 인수로 전달하는 것이 일반적입니다.이 작업을 더 많이 수행하도록 코드를 구성 할 수 있습니다.

"

OTOH, C ++ 98의 경우 참조로 전달하는 것이 가장 좋습니다. 복사되는 데이터가 적습니다. const 또는 non const 전달은 인수를 변경해야하는지 여부에 따라 다릅니다.


정상적인 대답은 함수에서 복사본을 만들어야하는 경우 값으로 전달되어야한다는 것입니다. 그렇지 않으면 const 참조로 전달하십시오.

다음은 좋은 토론입니다. http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

참고 URL : https://stackoverflow.com/questions/10789740/passing-stdstring-by-value-or-reference

반응형