in
참조로 전달하는 것은 논리적으로 값으로 전달하는 것과 같습니다.
옳은.
성능상의 이점이 있습니까?
예.
사물의 백엔드 측면에서 ref
매개 변수는 최소한 변수의 물리적 주소를 복사해야하며, 이는 일반적인 객체 참조와 동일한 크기 여야한다는 것이 제 생각입니다.
없다 요구 사항은 그 변수에 개체에 대한 참조와 참조 모두 같은 크기로, 그리고 거기에없는 요구 사항 중 하나는 컴퓨터 워드의 크기는 것을,하지만 네, 실제로는 32에서 32 비트입니다 비트 머신 및 64 비트 머신의 64 비트.
"물리적 주소"가 그것과 관련이 있다고 생각하는 것은 저에게 분명하지 않습니다. Windows 에서는 사용자 모드 코드의 실제 주소 가 아닌 가상 주소 를 사용합니다. 어떤 상황에서 실제 주소가 C # 프로그램에서 의미가 있다고 상상할 수 있는지 궁금합니다.
또한 모든 종류의 참조를 스토리지의 가상 주소로 구현할 필요 도 없습니다 . 참조는 CLI 사양을 준수하는 구현에서 GC 테이블에 대한 불투명 한 핸들 일 수 있습니다.
더 큰 구조체에서만 장점이 있습니까?
더 큰 구조체를 전달하는 비용을 줄이는 것이 기능에 대한 동기 부여 시나리오 입니다.
in
어떤 프로그램을 실제로 더 빠르게 만든다는 보장은 없으며 프로그램을 느리게 만들 수 있습니다. 성능에 대한 모든 질문은 경험적 연구를 통해 답해야합니다 . 항상이기는 최적화는 거의 없습니다 . 이것은 "항상 승리"최적화가 아닙니다.
다른 곳에서 매력적으로 만드는 비하인드 씬 컴파일러 최적화가 있습니까?
런타임 컴파일러 및된다 허용 하고 그렇게는 C # 사양의 규칙을 위반하지 않는 경우 그들이 선택하는 어떤 최적화를 할 수 있습니다. 내가 아는 한 in
매개 변수에 대한 최적화는 아직 없지만 이것이 향후 이러한 최적화를 배제하지는 않습니다.
모든 매개 변수를 입력하지 않는 이유는 무엇입니까?
글쎄, 당신이 int
매개 변수 대신 매개 변수 를 만들었다 고 가정하자 in int
. 어떤 비용이 부과됩니까?
- 이제 호출 사이트 에 값이 아닌 변수 가 필요합니다.
- 변수를 등록 할 수 없습니다. 지터의 신중하게 조정 된 레지스터 할당 체계에 렌치가 들어 있습니다.
- 호출 사이트의 코드는 변수에 대한 참조를 가져와 스택에 넣어야하기 때문에 더 큽니다. 반면에 단순히 값을 호출 스택에 푸시 할 수 있기 전에
- 더 큰 코드는 일부 짧은 점프 명령이 이제 긴 점프 명령이 될 수 있음을 의미하므로 코드가 이제 더 커졌습니다. 이것은 모든 종류의 일에 영향을 미칩니다. 캐시는 더 빨리 채워지고, 지터는 더 많은 작업을 수행하고, 지터는 더 큰 코드 크기에 대해 특정 최적화를 수행하지 않도록 선택할 수 있습니다.
- 피 호출자 사이트에서 스택 (또는 레지스터)의 값에 대한 액세스를 포인터로의 간접 지정으로 전환했습니다. 이제 포인터가 캐시에있을 가능성이 높지만 여전히 값에 대한 단일 명령어 액세스를 두 명령어 액세스로 전환했습니다.
- 등등.
a라고 가정 double
하고 in double
. 다시 말하지만, 이제 변수는 고성능 부동 소수점 레지스터에 등록 될 수 없습니다. 이것은 성능에 영향을 미칠 뿐만 아니라 프로그램 동작을 변경할 수도 있습니다! C #은 64 비트 이상의 정밀도로 부동 산술을 수행 할 수 있으며 일반적으로 부동 소수점을 등록 할 수있는 경우에만 수행합니다.
이것은 무료 최적화가 아닙니다. 대안에 대한 성능을 측정해야합니다. 가장 좋은 방법은 디자인 지침에서 제안하는 것처럼 애초에 큰 구조체를 만들지 않는 것입니다.
ref
로 전달하는 데 사용됩니다 . 구조체가 수정되지 않아야 함을 의미합니다.in