문제

아주 작은 물체가 필요할 때, 2 개의 플로트 속성이 포함되어 있다고 말하면, "파괴되지 않는"수백만 명이있을 것입니다.

도서관으로서 XNA에서와 같이, Point3s 등이 structs가 있지만 오랫동안 해당 값을 보유해야한다면 성능 위협이 될까요?

도움이 되었습니까?

해결책

구조에 대한 대부분의 질문과는 달리, 이것은 실제로 구조물을 잘 사용하는 것 같습니다. 포함 된 데이터가 값 유형이고 많은 것을 사용한다면 구조가 잘 작동합니다.

몇 가지 팁 :

:: 구조물이 16 바이트를보다 크지 않거나 성능 이점을 잃어 버리지 않아야합니다.

:: 구조물을 불변으로 만듭니다. 그것은 사용법을 더 명확하게 만듭니다.

예시:

public struct Point3D {

   public float X { get; private set; }
   public float Y { get; private set; }
   public float Z { get; private set; }

   public Point3D(float x, float y, float z) {
      X = x;
      Y = y;
      Z = z;
   }

   public Point3D Invert() {
      return new Point3D(-X, -Y, -Z);
   }

}

다른 팁

대답은 객체/값이 결국 저장 될 위치에 따라 다릅니다. Arraylist와 같은 유형의 컬렉션에 저장되면 복싱됩니다. 권투는 구조물의 객체 래퍼를 생성하고 발자국은 클래스 객체와 동일합니다. 반면에 t [] 또는 목록과 같은 유형 배열을 사용하는 경우 Structs를 사용하면 각 요소의 실제 데이터 만 컬렉션에 대한 풋 프린트와 요소가 아닌 만 저장합니다.

따라서 Structs는 t [] 배열에서 사용하기에 더 효율적입니다.

큰 관심사는 메모리가 스택 또는 힙에 할당되는지 여부입니다. 스트러크는 기본적으로 스택에 들어가고 스택은 일반적으로 공간 측면에서 훨씬 제한적입니다. 따라서 그렇게 많은 구획을 만드는 것은 문제가 될 수 있습니다.

그러나 실제로, 나는 그것이 그렇게 큰 거래라고 생각하지 않습니다. 당신이 그들 중 많은 사람들이 있다면, 그들은 어딘가에 클래스 인스턴스의 일부일 가능성이 높습니다.

구조는이 응용 프로그램에 적합한 것 같습니다.

"이러한 값을 유지해야 할 필요성"은 어딘가에 힙에 스토리지, 아마도 클래스 인스턴스의 배열 필드를 의미합니다.

조심해야 할 한 가지는 큰 물체 힙에 할당된다는 것입니다. 이 힙이 어떻게 자체적으로 훼손되는지는 분명하지 않지만, 아마도 문제가되지 않는 매우 오래 살았던 물체에 대해

이러한 데이터 유형에 수백만 개의 클래스를 사용하면이 유형의 작업을 위해 발생할 수있는 전단 규모의 전단 부피에서 비용이 많이들 수 있습니다.

원칙적으로, 동일한 유형의 비 aliased (즉, 공유되지 않은) 데이터의 대량 배열은 간접 수를 줄이기 때문에 성능을 위해 스트러크에 가장 잘 저장됩니다. (또한보십시오 아마도 대답 할 때). 클래스와 구조물의 정확한 성능 차이는 사용에 따라 다릅니다. (예 : 운영 중에는 구조물의 일부만 액세스합니까? 임시 복사를 많이합니까? 구조물이 작 으면 항상 사용하는 것이 더 나을 것이지만 큰 경우 임시 사본을 만들 수 있습니다. 값을 바꾸기 위해 항상 모든 것을 복사해야 할 것입니다.)

의심스러운 경우 측정하십시오.

그러한 측정에 의해 명백하지 않은 장기 효과에 관심이 있기 때문에, 그러한 배열은 대형 객체 힙에 저장 될 수 있으며 파괴 및 재 할당 대신 재사용해야한다는 것을 알고 있어야합니다. (보다 CRL 내부 : 큰 물체 힙이 발견되지 않았습니다.)

더 큰 크기의 문자를 통화로 전달할 때 복사를 피하기 위해 심판 인수로 전달할 수 있습니다.

값 유형 (struct)은 자주 힙에 할당되지 않는 유형에 적합합니다. 즉, 대부분 다른 참조 또는 값 유형에 포함되어 있습니다.

당신이 준 vector3 예제는 완벽한 예입니다. 당신은 힙에 벡터 3을 거의 매달려 있지 않으며, 대부분의 시간은 힙에있는 유형에 포함되거나 로컬 변수로 사용되며,이 경우 스택에 할당됩니다.

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