2012-01-03 3 views
4

option의 이점을 잘 알고 있지만 성능상의 이유로 option을 사용하지 않으려합니다. option은 가비지 수집기에 대한 더 많은 작업을 의미하는 클래스의 형식을 래핑합니다.F # 형식의 필드를 null로 강제 설정

이 경우 특히 같은 상황에서 모두 Some 인 여러 필드가 있지만 터플이 클래스이기 때문에 튜플에 넣지 않으려 고합니다. 그리고 GC에 추가적인 스트레스를줍니다. . 그래서 나는 에 접근한다. 그 목적은 option의 목적을 이겼다.

option 유형이 잠재적으로 null 인 참조로 처리되는 것을 알지 못하는 최적화가 없다면 null을 사용하고 싶습니다. 내가 할 수있는 방법이 있니?

편집 : 내가하고있는 일을 확장하기 위해 나는 bounding volume hierarchy을 만들고 있는데, 이는 실제로 리프 노드에서만 데이터가있는 이진 트리입니다. 항목을 불변으로 유지하는 것이 성능상의 이유로 옵션이 아니며 차별화 된 공용체가 mutable 구성원을 가질 수 없기 때문에 차별화 된 공용체가 아닌 클래스로 구현합니다. 다시 GC 압력에 추가합니다.

어리석게도 기능적 언어이므로 각 노드 유형을 Node 상위 유형의 상속으로 처리 할 수 ​​있습니다. Downcasting은 정확히 가장 빠른 작업은 아니지만 XNA와 WP7에 관한 한 거의 모든 것이 GC를 분노하는 것보다 낫습니다.

+1

추가 된 GC 스트레스가 실제로 중요합니까? – svick

+0

@svick 예, 불행히도 XNA 게임의 충돌 감지 용입니다. 이는 결국 WP7 또는 Xbox 360에서 실행될 수 있으며 둘 다 1 세대 GC를 사용한다는 의미입니다. –

+0

"이며 GC에 추가적인 스트레스를줍니다." - 이걸 측정 해 봤어? –

답변

2

this MSDN documentation에 따르면 [<AllowNullLiteral>] 속성을 사용하여 유형을 꾸미면 Unchecked.defaultof<T>()을 호출하여 null을 작성할 수 있습니다.

F #에서 원하는대로 할 수있는 유일한 방법 인 것 같습니다. 그렇지 않으면 다른 .net 언어로 마샬링하고 거기에서 null을 얻을 수 있습니다 ... 그러나 나는 그것이 당신이 원하는 것 같지 않다고 추측합니다

+0

그 때문에 소비자 유형도'[]'이라고 표시해야합니다.하지만 그것은 아무것도 아닌 것보다 낫습니다. 내 4 필드 중 3 개가 이제는 null 일 수 있습니다 - 왼쪽, 오른쪽 및 상위 노드. –

+6

사실, 나는 당신이 문서를 잘못 읽은 것으로 믿는다 : 자신이 소유 한 타입에'[]'을 사용하여 null을 적절한 값으로 허용한다. 'Unchecked.defaultof ()'을 사용하여 소유하지 않은 F # 타입의 null 값을 생성하고, 그렇지 않으면 null을 적절한 값으로 허용하지 않습니다. (즉,'object.ReferenceEquals (x, 컴파일러 검사를 해결하기 위해'x = null' 대신에'null ')을 사용합니다. –

+0

@Stephen 예, 필요한 모든 것이 "확인되지 않았습니다 .defaultof "였습니다. –

관련 문제