2013-11-08 3 views

답변

4

이것은 단순히 사실이 아닙니다. 대의원은 .Net에 고정되지 않습니다.

대리인은 PInvoke 함수에 대한 매개 변수로 사용될 때 고정 된 것처럼 작동합니다. CLR은 대리자에 대한 참조를 보유하는 네이티브 썽크를 할당합니다. 그러나이 참조는 대리자를 고정하지 않으며 개체에 대한 강력한 참조로도 작동하지 않습니다.

http://msdn.microsoft.com/en-us/magazine/cc164193.aspx#S7

는 객체를 고정하는 것은 자유가 아닙니다 마십시오. 실제로 GC에 상당한 비용이 소요됩니다. 소량으로 괜찮 으면 모든 .Net 대리인을 고정해야 성능에 큰 영향을 미칠 수 있습니다.

4

대리인 자체는 고정되어 있지 않으므로 GC에서 자유롭게 이동할 수 있습니다. 그러나 이것이 반드시 핀으로 고정해야한다는 의미는 아닙니다.

JIT에서는 생성되는 관리되지 않는 코드와 관리되지 않는 함수 포인터를 사용하여 대리인의 코드를 호출하는 경우 실제로 사용되는 내용이 이동되지 않습니다. (CLR은 팀의) 크리스 Brumme explained this in detail on his blog가 (여기서 핵심 문장이 스텁은 GC 힙의 외부 고정 된 메모리에 존재 입니다.) : 같은 라인을 따라

, 관리 대표가 관리되지 않는 코드로 마샬링 할 수있다 관리되지 않는 함수 포인터로 노출됩니다. 이러한 포인터를 호출하면 관리되지 않는 관리 전환이 수행됩니다. 호출 규칙의 변경. 올바른 AppDomain으로 입력; 필요한 모든 인수를 정렬합니다. 분명히 관리되지 않는 함수 포인터는 고정 주소를 참조해야합니다. GC가 그걸 재배치한다면 재앙이 될 것입니다! 이로 인해 많은 응용 프로그램에서 대리인의 고정 핸들을 만들 수 있습니다. 이것은 완전히 불필요합니다. 관리되지 않는 함수 포인터는 실제로 & 마샬링을 수행하기 위해 동적으로 생성하는 네이티브 코드 스텁을 참조합니다. 이 스텁은 GC 힙 외부의 고정 된 메모리에 있습니다.

그러나 응용 프로그램에서는 관리되지 않는 코드가 더 이상 호출되지 않을 때까지 대리자의 수명을 연장해야합니다. 네이티브 코드 스텁의 수명은 대리인의 수명과 직접 관련됩니다. 델리게이트가 수집되면 관리되지 않는 함수 포인터를 통한 후속 호출이 충돌하거나 프로세스를 손상시킵니다. 최근 릴리스에서 고객 디버그 프로브를 추가하여 코드에서이 너무나 흔한 버그를 완전히 감지 할 수있었습니다. 개발 중 고객 디버그 프로브를 사용하기 시작하지 않으 셨다면,보십시오!

따라서 corworker가 기술적으로 올바르지 않습니다. 대리인은 이동 될 수 있으며 고정되지 않습니다. 그러나 동료는 "올바른"정신을 가지고있었습니다. 대리자의 수명을 보장해야하지만 관리되지 않는 함수 포인터를 사용하여 호출하는 경우 반드시 위임자를 고정 할 필요는 없습니다.

+0

그가 의미있는 바는 정확할 수도 있지만, GC 오버 헤드가 추가되어 서버 코드에서 대리인을 사용하지 않아도되는 이유이기도합니다. 이 정보를 통해 나는 그 주장이 실제로 많은 물을 보유하고 있다고 생각하지 않는다. – recursive

+1

@ 재귀 적 예 - 저는 대의원을 피할 이유가 전혀 없음에 동의합니다.나는 그저 당신의 동료가이 잘못된 가정을 가지고있을 가능성이 높다고 지적하고 싶었습니다. 그것은 교육에 도움이 될 것입니다. –

관련 문제