문제

복싱은 많은 정보를 사용할 수있는 인기있는 개념이라는 것을 알고 있지만 실제로 답을 찾을 수없는 몇 가지 질문이 있습니다.

1) 복싱이 값 유형 (struct)이 객체 (참조 유형) 또는 참조 유형으로 변환되는 경우, 상자에 걸리고 성능 페널티가 발생하는 값 유형을 사용하는 이유는 무엇입니까? 구조물이나 클래스의 특정 경우에 혜택과 적합성을 알고 있습니다. (1) 값 (값 유형)은 임시 저장 공간에서 스택에 사는 경향이 있지만 얼마나 걸립니까? 유형이 필요하지 않으면 그 순간에 어떻게 관리하고 폐기 할 수 있습니까? 아니면 일회용 패턴이 작동하는 곳입니까? 구조물을 사용하는 이유는 그 이점 때문일 것이라고 가정합니다.

흥미롭게도, 구조물을 사용하여 두 개의 문자열과 DateTime 필드를 저장하면 구조물은 두 개의 참조 (문자열)와 DateTime을 함께 보유합니다. 나는 이것이 값이 흩어진 것보다 더 빠르다고 가정합니다. 이 디자인에서 알아야 할 것이 있습니까? (2).

1) http://en.csharp-online.net/classes, structs 및 객체-박스 및 Unboxing

2) http://dotnetperls.com/content/struct-examples.aspx

나는 여기에서 내가 추구 한 답변을 검색했지만 운이 없다. 나는 일반적 으로이 사이트에서 GC, 제네릭, 예외 처리 등과 같은 주제를 검색하고 배우고 공유 할 수있는 많은 지혜가 있습니다.

모든 포스터에 대한 (잠재적) 교육에 감사드립니다! 잠재적 순진함을 실례합니다. 내부를 배우는 것은 IL 등을 이해하는 데 약간의 시간을 보내는 데 도움이됩니다 (곧 다루어야 할 것).

도움이 되었습니까?

해결책

값 유형을 참조 변수로 전달하지 않으면 권투가 발생하지 않습니다. 모르는 경우 다음에 대답하십시오 질문:

  • 원시 유형처럼 행동하십시오.
  • 16 바이트 미만 인스턴스 크기가 있습니다.
  • 불변입니다.
  • 가치 의미론이 바람직하다.

나는 또한 보통 그러한 변수의 수명이 무엇인지 고려합니다. 방법 내에서 사용되는 로컬 변수라면 텐트를 사용하여 구조물 (그렇지 않으면 클래스)을 사용합니다.

다른 팁

성능 이득이 아니라 논리적 이점으로 인해 가치 유형을 사용해야합니다. 즉, 가치 유형은 스택에서 관리되기 때문에 쓰레기 수집에 참여할 필요가 없습니다. int, float, double 등과 같은 끊임없이 생성되고 폐기되는 유형이 있다면, 이들을 스트루크로 바꾸어 잘 향상 될 수 있습니다. 조심해야 할 것은 구조물을 불변으로 만들 수있는 경우에만 이것을 고려해야한다는 것입니다.

고려해야 할 몇 가지 다른 것 -

먼저, 스트러크가 불변이 아닌지 확인하려고합니다 (일반적으로). 이 때문에 참조 유형을 포함하는 스트러크가없는 것은 좋은 경험 법칙입니다. 문자열은 C#에서는 불변이 없기 때문에 이것에 대한 예외가 될 수 있지만, 디자인을위한 일반적인 목적 규칙의 관점에서 볼 때, 나는 이것에주의를 기울일 것입니다.

둘째, 지금까지 언급되지 않은 구조에 대한 또 다른 사용 사례가 있습니다. 작은 객체의 큰 목록 또는 배열이있는 경우 Structs는 크게 더 나은 캐시 일관성을 제공하며 절대적으로 중요합니다. 그렇기 때문에 대부분의 3D 엔진은 점/벡터에 스트러크를 사용하는 이유입니다. 정점에 대한 점수가 큰 경향이 있습니다.

성능이 응용 프로그램의 중요한 부분 인 경우주의를 기울일 가치가 있습니다. 예를 들어, 내 앱 중 하나에서, 단일 유형을 클래스에서 구조물로 변경하면 장거리 러닝 (> 5 분 런타임) 프로세스에서 40% 할인 된 구조물로 깎았습니다. 무거운 수학 계산에서 반복적으로 사용하는 경우 객체를 메모리에 가깝게두면 큰 이익을 얻을 수 있습니다.

이제 - 당신의 경우, 두 줄과 dateTime을 갖는 것은 아마도 이것으로부터 어떤 개선도 보지 못할 것입니다. 문자열에서 작동하는 루틴의 유형은 아마도 무거운 계산 (희망적으로), 즉 공간에서 50 만 포인트를 변환하거나, 대형 매트릭스 솔루션을 수행하는 것 등을 수행하지 않을 것입니다.

마지막으로 - .NET3.5SP1이 스트러크를 훨씬 더 유용하게 만들었 음을 알 수 있습니다. 3.5SP1 이전 (X86) 이전에는 구조물 호출과 관련된 방법이 없었습니다. 이것은 스트러크를 통해 가능한 성능 이득을 제한했습니다. 프레임 워크를 업데이트하면 오래된 구조물 코드가 훨씬 빠르고 (경우에 따라) 훨씬 빠르게 만들 수 있습니다.

항상 권투가 필요하지는 않으며 제네릭에는 필요하지 않습니다.
값 유형 (struct is value 유형)이 사용하는 메모리는 다음과 같이 주장됩니다.
메소드가 끝나고 반환되면
그런 일이 일어나려면 무엇이든해야합니다.

인스턴스 멤버로 선언 된 값 유형은 개체가 될 때까지 메모리에있을 것입니다.
GC에 의해 삭제됩니다.

참조 유형은 관리 된 힙에 보관됩니다.
메소드 내에서 인스턴스화 된 참조 유형은
물체가 참조를 보유하지 않을 때는 쓰레기 수집가.

GC는 스스로 작동하며 대부분 내버려 두어야합니다.
GC에 의해 객체를 삭제할시기를 예측할 수 없습니다.

처분 패턴은 참조 유형에 사용되지만 GC가 삭제하도록 강요하지 않습니다.
객체. 일반적으로 관리되지 않은 자원을 자유롭게하는 데 사용됩니다.

스택의 값은 다음을 고려하십시오.
아래와 같은 세 가지 방법이있는 간단한 프로그램이 있다고 가정 해 봅시다.
이 프로그램이 실행되면 기본 방법이 실행됩니다. 다음을 따르십시오
아래 번호 :


Main
{
   // (0) Stack is empty
   int firstInt = 0;
   // (1) Stack now contains:
   //                     firstInt
   DoSomething1();
   // (7) Stack still contains:
   //                     firstInt
}
// Program ends

DoSomething()
{
   int anInteger = 0; 
   // (2) Stack now contains:
   //                    anInteger
   //                    firstInt
   DoMore()
   // (5) Stack now contains:
   //                     anInteger
   //                     firstInt
}
// (6) anInteger goes out of scope

DoMore
{
  int anotherInteger = 1; 
   // (3) Stack now contains:
   //                     anotherInteger
   //                     anInteger
   //                     firstInt
}
// (4) anotherInteger goes out of scope

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top