누구나 말해 줄 수 있습니다. func (문자열) 대신 string을 func (문자열 &)로 전달하면 어떤 이점이 있습니까?이것은 문자열을 함수에 인수로 전달하는 메모리 효율적인 방법입니다.
답변
당신이 값으로 참조를 전달하는 대신 당신이 함수 호출에 복사본을 만들 필요가 있다는 것을 의미 값에 의해 객체를 전달하는 것이 아니라, 참조에 의해 객체를 전달 . 함수가 전달 된 개체를 수정하지 않거나
- :
그러나, 통과별로 참조하면 인식하고 있어야합니다 질문의 새로운 세트를 소개합니다? 그렇지 않다면
const
수식어 - 에 넣어야합니다. 함수가 개체를 수정해야하지만 함수 경계 외부에서 수정을 노출하지 않아야합니까? 이 경우 정말로 원하는 것은 사본입니다.
- 함수가 어딘가에/여하튼 전달 된 객체의 참조를 저장합니까? 이 경우 객체 소유권이 어떻게 전달되고 삭제할 수 있는지 이해해야합니다. 통과별로 참조하는 함수 호출 저렴하게해서 당신이 어떤 경우에 사용한다는 것을 의미하지 않습니다 당신은 이러한 문제
요점은 처리 할 smart pointers를 사용할 수 있습니다.
일반적으로 성능을 고려하는 경우 참조로 전달하는 것이 값에 의해 전달하는 것보다 낫습니다 (기본 제공 데이터 형식 제외). 따라서 예 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
'string' 최적화에 대해 좀 더 자세히 알려면'string'은 [COW] (http://en.wikipedia.org/wiki/Copy-on-write) 'd입니다. '문자열'을 값으로 전달하면 새로운 '문자열'이 생성되지만 원래의 문자열 (예 : 문자 배열)은 원래 '문자열'과 새로운 '문자열'간에 공유됩니다. 따라서 로컬 복사본이 수정되지 않는 한 오버 헤드가 있지만 그리 많지는 않습니다. ** 편집 : ** 내 의견을 쓰는 동안 이것을 설명하기 위해 편집 한 것처럼 보입니다. – Mac
@Mac 그게 사실 일 필요는 없습니다. 일부 구현체는 COW입니다. 일부는 그렇지 않습니다. C++ 11의 일부 변경 사항으로 COW 문자열을 준수하는 표준 라이브러리를 제공 할 수 없게되었지만, 이 마지막 부분에 대해 확신하지 못한다. –
@ DavidRodríguez-dribeas : 절대적으로 맞습니다 - 제가 말하고자했던 것은 '문자열'이 * 전형적으로 * 우두머리였습니다. – Mac
func(string &)
은 참조로 문자열을 전달합니다. 이는 복사되지 않으며 함수가 수정할 수 있음을 의미합니다.
func(string)
은 문자열을 값으로 전달합니다. 즉, 복사본이 만들어지고 함수는 해당 문자열의 로컬 복사본 만 수정할 수 있음을 의미합니다.
복사하지 않고 문자열을 전달하지만 수정되지 않도록하려면 func(const string&)
을 사용하십시오.
어쨌든 함수가 인수의 복사본을 가져와야하는 경우 값으로 전달하는 것이 좋습니다.
'func'가 매개 변수를 수정할 필요가없는 경우'func (const string &)'를 고려해야합니다. 어쨌든 함수가이 param을 수정할 수 없기 때문에'func (string) '을 고려해 보았다면, 함수 func (const string &)를 사용해야한다는 것을 의미합니다 ... – MichalR
"함수가 인수의 복사본을 가져 가야한다면, 값으로 전달하는 것이 바람직합니다. " 어떻게 도움이 될까요? –
@Paul : 인수와 함수에 별도의 변수가 필요 없으므로 함수를 약간 더 쉽게 만들고 오류를 발생시키지 않습니다. –
참조는 일반적으로 복잡한 유형에 대한 효율적입니다 전달하지만, 함수를 수정 할 수 있도록하려는 않는 한 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
또한 대신 func(const string&)
을 사용할 수 있습니다 func(string&)
참조 전달 된 매개 변수가 함수 내부에서 실수로 변경되지 않았는지 확인하십시오.
예. 참조를 전달하는 것이 항상 효율적입니다.
문자열을 값으로 저장할 수 있으며 복사하는 데 O (n)만큼 오래 걸릴 수 있습니다 (즉, 복사하는 데 시간이 문자열의 길이에 비례합니다). 또한 힙 메모리가 할당되기도합니다. 보통 힙 메모리는 복사보다 훨씬 비쌉니다.
의도하지 않은 변경을 피하기 위해 reference-to-const, 즉 func (const string &)로 전달할 수도 있습니다.
으로 전달하면 문자열이 먼저 복사되고 복사본이 함수로 전송됩니다. 문자열과 같은 값 비싼 객체를 전달하는 가장 좋은 방법은 함수를 수정하지 않으려면 const string&
입니다.
const
이 중요합니다. 우선, 함수 내에서 문자열이 수정되지 않도록합니다. 또한 func("this is a litearal because it isn't inside a variable")
을 사용하지 않으면 함수에 리터럴을 전달할 수 없습니다.
이동 의미를 사용하여 rvalue 참조 최적화를 사용해 볼 수도 있습니다.
void func(string &&s)
{
myS = std::move(s);
}
- 1. 함수에 하위 목록을 전달하는 효율적인 방법
- 2. MATLAB에서 문자열을 함수 인수로 전달하는 방법은 무엇입니까?
- 3. 이것은 SQLConnection을 처리하는 올바른 방법입니다
- 4. 이것은 표현자를 테스트하는 올바른 방법입니다.
- 5. 이것은 도메인 클래스를 모델링하는 방법입니다
- 6. 인수로 size_t를 전달하는 "효율성"
- 7. 함수를 인수로 전달하는 개체
- 8. CreateProcess 함수에 문자열을 전달하는 방법은 무엇입니까?
- 9. 문자열을 ref가 아닌 함수에 전달하는 법 (Ruby)
- 10. 내부 메모리 또는 DB에 안드로이드 이미지를 저장합니다. 가장 효율적인 방법입니다.
- 11. 양식 제출에서 검색된 매개 변수를 장고의 함수에 인수로 전달하는 방법
- 12. EL 변수에 액세스하여 EL의 함수에 인수로 전달하는 방법은 무엇입니까?
- 13. PHP : 문자열을 따옴표로 묶지 않고 인수로 전달하는 방법은 무엇입니까?
- 14. 이것은 PHP에서 네임 스페이스를 사용하는 좋은 방법입니다
- 15. 문자열을 분할하여 함수에 전달
- 16. 정적 변수를 인수로 함수에 전달
- 17. C에서 함수에 인수로 포인터 전달
- 18. std :: list를 함수에 인수로 사용하면
- 19. 인라인 어셈블리의 "call"명령에 문자열을 인수로 전달하는 방법은 무엇입니까?
- 20. 큰 따옴표를 포함한 문자열을 BAT 파일에 인수로 전달하는 방법
- 21. urllib.urlencode()에 인수로 유니 코드 문자열을 전달하는 방법
- 22. 코코아 - 문자열을 인수로 사용
- 23. 문자열을 인수로 컨트롤러에 전달합니다.
- 24. javascript 함수에 div 클래스를 인수로 전달합니다.
- 25. 함수에 값을 전달하는 방법
- 26. AS2에서 다차원 배열을 인수로 전달하는 방법은 무엇입니까?
- 27. 인수로 파일 이름을 전달하는 중
- 28. SWIG 생성 인터페이스를 사용하여 Java에서 C++ 함수에 문자열을 전달하는 방법
- 29. 사용자가 입력 한 문자열을 상수 문자가 필요한 함수에 전달하는 문제 *
- 30. xhtml에서 자바 스크립트 함수에 문자열을 전달하는 방법은 무엇입니까?
경우 2, 나는 여전히 매개 변수로'const '를 넣고 함수 내부에 복사본을 만들 것입니다. 특히 복사를하기 전에 함수가 실패/리턴 * 할 것이라는 점을 고려할 때. – xanatos
@xanatos 네, 가능 합니다만,이 함수가 크게 호출되지 않고 복사를하기 전에 반환 될 확률이 높으면 인수로 값을 전달하는 것이 더 간단합니다. – akappa
(Björn Pollex의 답변에서 Steve Jessop의 주장은이 논쟁에서 좋은 것이라고 생각합니다.) – akappa