2010-08-17 3 views
6

가능한 중복 :
Pass by value vs Pass by reference performance C#.net
참조로 값을 전달하면 속도가 크게 향상됩니까?

사람이 이미 참조로 매개 변수를 전달하는 빠른 단지를 복사하는 것보다 훨씬 경우 테스트 했습니까?

그러나 질문의 ​​주된 초점은 : ref 키워드를 사용하지 않는 것과 반대의 단점이 있습니까?

+0

이 스레드 좀보세요 : http://stackoverflow.com/questions/408101/which-is-faster-byval-or-byref – MUG4N

+0

이것은 오래된 도구지만 감사합니다 –

답변

14

아니요, 속도가 크게 향상되지 않습니다. 반대로 ref 키워드를 사용하면 코드를 느리게 만들 수있는 다른 수준의 간접 지정을 추가하게됩니다.

매개 변수는 일반적으로 값으로 전달됩니다. 즉, 매개 변수는 복사됩니다. int과 같은 간단한 값의 경우 단순히 값의 복사본이 스택에 저장된다는 의미입니다.

참조 유형이 string 인 경우 참조 사본이 스택에 놓이게됩니다. 따라서 전체 개체가 복사된다는 의미는 아니며 복사 된 개체에 대한 참조 일뿐입니다.

특별한 이유가없는 한 일반적으로 ref 또는 out 키워드를 사용하지 않아야합니다.

+1

작은 nitpick : 만약 당신이 * 큰 * 구조체가 ref로 전달하면 성능이 약간 향상 될 수 있습니다. 그 구조체가 너무 커서 val을 지나치면 퍼포먼스에 큰 영향을 미친다. 타입 자체를 리팩토링하는 것에 대해 진지하게 고려해야한다. – LukeH

+0

'string' 인수를 사용할 때 참조 만 전달되면 전달 된 변수를 변경할 때 원래 변수가 어떻게 변경되지 않습니까? 메모리에 문자열의 새로운 사본이 있어야합니다 (또는 틀렸습니까?). 그리고 정말로 큰 문자열을 처리 (또는 파싱하지 만 변경하지 않는 경우)하면 'ref'로 전달하는 것이 더 빠르지 않습니까? 설명 해 주셔서 감사합니다 :). – Buksy

+0

@Buksy : 값으로 전달 된 참조 유형 (문자열과 같은)의 매개 변수는 참조 복사본이 전달됨을 의미합니다. 매개 변수를 변경하면 원래 참조에 영향을주지 않습니다. 또 다른 요소는 문자열이 변경되지 않으므로 원래 문자열을 변경할 수 없다는 것입니다. 문자열 매개 변수를 참조로 보내면 원래 참조가 다른 문자열 객체를 가리 키도록 변경할 수 있습니다.문자열은 변경할 수 없으므로 메서드를 변경할 수 없도록 복사 할 필요가 없으므로 문자열을 값 효율적으로 전달할 수 있습니다. – Guffa

3

ref 키워드 않고 그들을 전달 치형과 C#의 참조 형식의 경우

의 참조 유형이있다하는 참조를 전달하는 것을 의미한다. 필자는 그것을 테스트하지 않았지만 컴파일러와 .NET 프레임 워크의 구현 자들이 가능한 한 빨리 전달할 것으로 기대합니다. 그 참조를 전달하는 것이 처음부터 참조를 전달하는 것보다 빠르다는 것을 상상할 수 없습니다. 그것은 말이되지 않습니다.

값 유형의 경우 다른 이야기입니다. 구조체가 큰 경우에는 복사하는 것이 값 비싸고 참조를 전달하는 것이 빠릅니다. 그러나 값 유형은 이유 때문에 값 유형이 될 수 있습니다. 값 유형이 이고 인 경우 함수에 전달하는 효율성에 대해 염려하지만 대부분 실수로 값 유형이됩니다.

관련 문제