2009-09-22 6 views
1

아주 간단한 질문입니다. 메모리에 100KB - 2MB 개체를 저장하는 방법은 무엇입니까? 오브젝트는 3 개의 double과 2 개의 string으로 이루어져 있습니다. 클래스 대신 struct를 사용하면 더 좋을까요?매우 많은 수의 객체를 메모리에 저장하는 가장 좋은 방법은 무엇입니까?

편집 : 더블 말했다 이유를 모르겠어요, 그것은 떠입니다 .. : S

+0

개체가 서로 어떻게 관련되어 있는지에 따라 다릅니다. – snarf

+0

속성이있는 포인트가 있습니다 –

+0

부유하는 이유가 있습니까? Decimal이 처리 할 수있는 것보다 더 큰 점 또는 더 정확한 점입니까? –

답변

3

많은 수의 개체를 처리 할 때 고려해야 할 두 가지 주요 문제가 있습니다.

첫 번째 문제는 Frederik Gheysels의 answer에서 메모리 문제 인 Fly 가중치 패턴을 사용하여 해결되었습니다.

두 번째 문제는 효율적으로 이러한 개체/구조체를 추가하고 검색하는 방법입니다 (따라야하는 경로에 따라 다름). 분명히 나는이 객체들을 생성하고 다시 검색하고 싶지 않다고 가정하고있다.)

이 질문에 답하기 위해서는 실제로 데이터를 추가하고 액세스하는 방법에 달려있다. 여기에서 작업에 가장 적합한 데이터 구조를 결정할 수 있습니다. 예를 들어 LIFO 순서로 이러한 객체를 처리하려는 경우 스택이 가장 효율적인 방법이 될 수 있습니다.

2

Flyweight pattern 사용의 가능성은?

유형이 값 유형을 나타내는 경우 구조체를 사용할 수 있습니다. 구조체는 할당 및 할당 해제가 더 저렴합니다. 디자인 지침을 고려하면 다음과 같은 경우 구조체를 사용할 수 있습니다.

  • 유형의 인스턴스 크기가 16 바이트 미만입니다.
  • 인스턴스가 수명이 짧습니다.
  • 인스턴스가 변경되지 않습니다 (모든 값 유형은 imho 여야 함).
+0

첫 번째 3 배가 모두 포인트 코디입니다. 따라서 모든 문자열이이 문자열에 있지만, 매우 의심 스럽습니다./ –

0

구조체와 클래스간에 차이가 있는지 의심 스럽지만 확실히 C++에서는 본질적으로 같은 것입니다. 당신이 제안하는 크기의 2M 객체는 현대 데스크탑 시스템에서 그다지 크지 않습니다.

+1

.NET에서 큰 차이가 있습니다. 구조체는 값 유형이고 스택에 할당되므로 클래스가 참조 유형이며 힙에 할당됩니다. –

+0

질문에 .NET 태그가 지정되어 OP에서 C++에 대해 묻지 않습니다. 그러나 당신은 완전히 옳습니다. 그 크기의 2M 개체는 이상한 것이 아닙니다. –

+1

@ Frederik : 이것은 부분적으로 만 정확합니다. 값 유형! = 스택에 할당 됨 !!! http://stackoverflow.com/questions/1130468/memory-allocation-of-value-types-and-reference-types-in-net-framework를 참조하십시오. –

1

내가하는 일에 대해 많이 알지는 못하지만 이러한 엄지 손가락 규칙은 어떨까요?

콜렉션에 포인트를 저장해야하는 경우 저장을 위해 복싱 구조의 오버 헤드를 절약하기 위해 클래스를 만듭니다.

포인트를 입력 데이터로 사용하여 처리하기 위해 다른 개체에 사용하는 경우. 처리를 위해 메쉬의 포인트로 사용하고, Collection 클래스 오버 헤드를 저장하는 배열을 선호합니다.

배열에 포인트를 저장하는 경우 클래스를 구성하는 것보다 효율적이므로 구조체를 만듭니다.

관련 문제