2011-10-19 3 views

답변

3

당신이 값으로 참조를 전달하는 대신 당신이 함수 호출에 복사본을 만들 필요가 있다는 것을 의미 값에 의해 객체를 전달하는 것이 아니라, 참조에 의해 객체를 전달 . 함수가 전달 된 개체를 수정하지 않거나

  1. :

    그러나, 통과별로 참조하면 인식하고 있어야합니다 질문의 새로운 세트를 소개합니다? 그렇지 않다면 const 수식어

  2. 에 넣어야합니다. 함수가 개체를 수정해야하지만 함수 경계 외부에서 수정을 노출하지 않아야합니까? 이 경우 정말로 원하는 것은 사본입니다.
  3. 함수가 어딘가에/여하튼 전달 된 객체의 참조를 저장합니까? 이 경우 객체 소유권이 어떻게 전달되고 삭제할 수 있는지 이해해야합니다. 통과별로 참조하는 함수 호출 저렴하게해서 당신이 어떤 경우에 사용한다는 것을 의미하지 않습니다 당신은 이러한 문제

요점은 처리 할 smart pointers를 사용할 수 있습니다.

+0

경우 2, 나는 여전히 매개 변수로'const '를 넣고 함수 내부에 복사본을 만들 것입니다. 특히 복사를하기 전에 함수가 실패/리턴 * 할 것이라는 점을 고려할 때. – xanatos

+0

@xanatos 네, 가능 합니다만,이 함수가 크게 호출되지 않고 복사를하기 전에 반환 될 확률이 높으면 인수로 값을 전달하는 것이 더 간단합니다. – akappa

+0

(Björn Pollex의 답변에서 Steve Jessop의 주장은이 논쟁에서 좋은 것이라고 생각합니다.) – akappa

0

일반적으로 성능을 고려하는 경우 참조로 전달하는 것이 값에 의해 전달하는 것보다 낫습니다 (기본 제공 데이터 형식 제외). 따라서 예 func(string&)func(string)보다 좋습니다. 함수가 완료되면 전달 된 string이 수정 될 수 있습니다. string을 변경하지 않으려면 func(const string&)을 사용하십시오.

STL에서 string이 최적화되어있는 것을 나는 기억합니다. 값으로 string을 전달하면 힙에 새로운 문자열이 작성되지 않을 수도 있습니다. 그래서 값으로 지나가는 것은 당신이 기대하는 것보다 훨씬 비싸지는 않을 것입니다. 예 :

string s1 = "hello"; // new buffer allocated on heap and copied "hello" 
string s2 = s1; // s2 and s1 both 'may' refer to same heap 
... 
s1 += " world"; // s2 continue referring to old heap ... 
       // new heap created to accomodate "hello world" referred by s1 
+1

'string' 최적화에 대해 좀 더 자세히 알려면'string'은 [COW] (http://en.wikipedia.org/wiki/Copy-on-write) 'd입니다. '문자열'을 값으로 전달하면 새로운 '문자열'이 생성되지만 원래의 문자열 (예 : 문자 배열)은 원래 '문자열'과 새로운 '문자열'간에 공유됩니다. 따라서 로컬 복사본이 수정되지 않는 한 오버 헤드가 있지만 그리 많지는 않습니다. ** 편집 : ** 내 의견을 쓰는 동안 이것을 설명하기 위해 편집 한 것처럼 보입니다. – Mac

+1

@Mac 그게 사실 일 필요는 없습니다. 일부 구현체는 COW입니다. 일부는 그렇지 않습니다. C++ 11의 일부 변경 사항으로 COW 문자열을 준수하는 표준 라이브러리를 제공 할 수 없게되었지만, 이 마지막 부분에 대해 확신하지 못한다. –

+0

@ DavidRodríguez-dribeas : 절대적으로 맞습니다 - 제가 말하고자했던 것은 '문자열'이 * 전형적으로 * 우두머리였습니다. – Mac

3

func(string &)은 참조로 문자열을 전달합니다. 이는 복사되지 않으며 함수가 수정할 수 있음을 의미합니다.

func(string)은 문자열을 값으로 전달합니다. 즉, 복사본이 만들어지고 함수는 해당 문자열의 로컬 복사본 만 수정할 수 있음을 의미합니다.

복사하지 않고 문자열을 전달하지만 수정되지 않도록하려면 func(const string&)을 사용하십시오.

어쨌든 함수가 인수의 복사본을 가져와야하는 경우 값으로 전달하는 것이 좋습니다.

+0

'func'가 매개 변수를 수정할 필요가없는 경우'func (const string &)'를 고려해야합니다. 어쨌든 함수가이 param을 수정할 수 없기 때문에'func (string) '을 고려해 보았다면, 함수 func (const string &)를 사용해야한다는 것을 의미합니다 ... – MichalR

+0

"함수가 인수의 복사본을 가져 가야한다면, 값으로 전달하는 것이 바람직합니다. " 어떻게 도움이 될까요? –

+0

@Paul : 인수와 함수에 별도의 변수가 필요 없으므로 함수를 약간 더 쉽게 만들고 오류를 발생시키지 않습니다. –

2

참조는 일반적으로 복잡한 유형에 대한 효율적입니다 전달하지만, 함수를 수정 할 수 있도록하려는 않는 한 const에 대한 참조한다 :

void f(string);  // function gets its own copy - copying may be expensive 
void f(string&);  // function can modify the caller's string 
void f(string const&); // function can read the caller's string, but not modify it 
1

또한 대신 func(const string&)을 사용할 수 있습니다 func(string&) 참조 전달 된 매개 변수가 함수 내부에서 실수로 변경되지 않았는지 확인하십시오.

0

예. 참조를 전달하는 것이 항상 효율적입니다.
문자열을 값으로 저장할 수 있으며 복사하는 데 O (n)만큼 오래 걸릴 수 있습니다 (즉, 복사하는 데 시간이 문자열의 길이에 비례합니다). 또한 힙 메모리가 할당되기도합니다. 보통 힙 메모리는 복사보다 훨씬 비쌉니다.
의도하지 않은 변경을 피하기 위해 reference-to-const, 즉 func (const string &)로 전달할 수도 있습니다.

1

으로 전달하면 문자열이 먼저 복사되고 복사본이 함수로 전송됩니다. 문자열과 같은 값 비싼 객체를 전달하는 가장 좋은 방법은 함수를 수정하지 않으려면 const string&입니다.

const이 중요합니다. 우선, 함수 내에서 문자열이 수정되지 않도록합니다. 또한 func("this is a litearal because it isn't inside a variable")을 사용하지 않으면 함수에 리터럴을 전달할 수 없습니다.

0

이동 의미를 사용하여 rvalue 참조 최적화를 사용해 볼 수도 있습니다.

void func(string &&s) 
{ 
    myS = std::move(s); 
} 
관련 문제