2009-12-11 4 views
18

C++ 문자열을 참조로 전달할 때보 다 효율적으로 사용할 수있을만큼 작게 간주하는지 궁금합니다. 참조로C++ 문자열을 값 또는 참조로 전달

+0

왜? 즉,이 지식으로 무엇을 성취하기를 희망합니까? – wallyk

+0

가능한 복제본 : http://stackoverflow.com/questions/1567138/const-t-arg-vs-t-arg –

+0

시간 여행이 포함되어 있지만 지금은 [이 날짜가 const std :: string &를 매개 변수로 전달하는 방법?] (https://stackoverflow.com/questions/10231349/are-the-days-of-passing-const-stdstring-as-a-parameter-over), 이것은 현대 C++의 관점에서이 질문에 대한 표준적인 논의입니다. –

답변

30

호 패스를 : 일반적

void foo(const std::string& pString); 

, 그들이 비 단순 복사 생성자가 그렇지 않은 경우에 의해 값에 의해 참조 것을 전달한다.

문자열은 일반적으로 데이터에 대한 포인터와 길이 카운터로 구성됩니다. 그것은 구현이 정의 되었기 때문에 더 많거나 적게 포함될 수 있지만 구현시 하나의 포인터 만 사용하는 것은 거의 없습니다.

템플릿 코드에서 컴파일러는 함수의 정의를 사용할 수 있으므로 const T&을 사용할 수도 있습니다. 즉, 참조가되어야하는지 또는 그렇지 않은지를 결정할 수 있습니다. (제 생각 엔)

+5

당신의 휴리스틱은'double'과'long double' (일반적으로 값으로 전달되는 것이 더 낫습니다)에서 작동하지 않습니다. 또한 단일 인수 함수의 경우 레지스터가 두 부분을 저장하고 여분의 간접 참조를 저장하는 데 사용되므로 일반적으로 2 x 기계어 UDT를 값으로 전달하는 것이 좋습니다. –

+4

또한'sizeof (T)'는 복사 될 데이터의 실제 크기를 측정하지 않기 때문에 일반적으로 매우 좋지 않은 척도입니다. 'string'은 특히 좋은 예입니다. 'sizeof (string)'는 순진한 구현 (데이터에 대한 간단한 포인터)에서 보통 sizeof (void *)이거나 짧은 문자열 최적화에서 2-3 단어입니다. 이행. 그러나 문자열을 복사하면 복사 생성자가 가리키는 데이터를 복사합니다. 이는 설명되지 않은 것입니다. 같은 것은'vector'와 다른 많은 것들에 사용됩니다. –

+0

어때요? – GManNickG

2

확실히 아닙니다. 특정 구현에 쓰기시 복사 (copy-on-write) 의미가 없으면 (요즘은 쓰레딩 문제로 인해 희귀합니다.) 실제 문자열 데이터가 힙에 저장되어 있어도 전체 문자열을 값으로 전달하면 전체 문자열을 복사해야합니다. 문자열 객체 자체가 내부적으로 몇 개의 포인터 일지라도 복사 할 데이터의 양은 문자열의 길이에 선형입니다.