2010-01-08 5 views
1

C#에서는 다음과 같은 메모리를 저장합니까?메모리 이해

private List<byte[]> _stream; 
public object Stream 
{ 
    get 
    { 
     if (_stream == null) 
     { 
      _stream = new List<byte[]>(); 
     } 
     return _stream; 
    } 
} 

편집 : 미안, 내가 좀 더 구체적인 있었어야 같아요.

특히 List 대신 "object"를 사용합니다 ... 나는 이상한 일이 있기 때문에 다소 실마리가 있다고 생각했습니다.

+1

매번 새로운 _stream을 반환하는 것과 반대? –

+6

어떤 대안에 비해 메모리를 절약합니까? 문제는 너무 애매합니다. – Nick

+0

실제로 어떤 질문입니까? 그래서 왜 안되는거야? –

답변

5

매우 적은 메모리를 절약합니다. 빈 List<byte[]>이 차지할 메모리 양은 바이트 크기입니다.

왜 참조 변수 _stream은 개체에 대한 참조를 보유하기에 충분한 메모리 만 할당하면되기 때문입니다. 오브젝트가 할당되면, 시간이 경과함에 따라 증가하거나 줄어들 수있는 일정량의 메모리를 차지합니다 (예 : 에 새로운 byte[]이 추가 된 경우). 그러나 해당 객체에 대한 참조에 의해 차지 된 메모리는 동일한 크기를 유지합니다. 그들이 등의 컬렉션/배열입니다 때 private 멤버에 대한 참조를 반환 할 정말 최적이 아니다 대부분의 경우, 비록

private List<byte[]> _stream = new List<byte[]>(); 
public object Stream 
{ 
    get 
    { 
     return _stream; 
    } 
} 

: 당신에게 두통의 원인이

이 간단하고 코너 케이스에 덜 경향이있다 _stream.AsReadOnlyCollection()을 반환하는 것이 좋습니다.

1

무엇보다 메모리를 절약 할 수 있습니까?

byte[][] _stream; 

어쩌면? 그렇다면 아니요, List<T>은 심장부에있는 배열이기 때문에 더 많은 메모리를 차지합니다 (정확히 내용의 크기는 아니지만 일반적으로 더 큼). 일부 상태 유지도 수행해야합니다.

0

스트림이 byte [] 또는 byte 목록이 아니겠습니까? 아니면 더 나은, MemoryStream? :) 나는 당신이 다소 혼란 스럽다고 생각한다. 그래서 더 큰 예제와 시나리오의 세부 사항들이 많이 도움이 될 것이다.

0

오브젝트 정말

내가 ... 구조체 같은 개체의 생각을 제시하고 구조에 대한 포인터로 객체 참조 것은 무엇입니까.

오브젝트를 인스턴스화하는 경우 모든 필드 (구현중인 클래스에 대한 참조)와 생성자가 예약 한 모든 메모리 (다른 오브젝트, 배열 등)가있는 "구조체"에 대해 메모리를 예약합니다.).

목록에서 상태 보존 용 메모리 (예 : C#에서 구현 된 방법을 알 수 없음) 및 초기 내부 배열 (10 개의 참조 일 가능성이 있음)을 예약합니다. 당신은 같은 그 뭔가 계산한다면 ... (32 비트 런타임 가정을, 나는 .NET 전문가가 아니에요) : 클래스

  • 포인터 : 4 바이트 배열에
  • 포인터 : 4 바이트
  • 배열 initialCapacity 참조 : 40 바이트

내 견적은 약 48 바이트입니다. 그러나 구현에 따라 다릅니다.

솔로 볼드 (SoloBold)가 말하기를 : 대부분의 경우 가치가 없습니다.

+1

오, 안돼, 그러지 마. 구조체는 값 유형이기 때문에 참조 유형과는 매우 다른 의미를가집니다. 클래스를 특수한 구조체로 생각하거나 그 반대의 경우를 생각하는 것은 대단히 오해의 소지가 있습니다. – jason

+0

아마도 MMm은 내 게시물이 오해의 소지가 있습니다. CS를 배웠을 때 추상적 인 데이터 유형을 사용하는 첫 번째 클래스가 있었고 구조체에 대한 포인터를 통해 함수를 사용했습니다. 구조체가 객체이기 때문에 객체에 대한 참조가 구조체에 대한 포인터로 구현 되었기 때문에 객체에 매우 가깝습니다. "Client a = new Client()"는 "StClient * a = malloc (sizeof (StClient))"와 같습니다. 여기서 StClient는 객체 클라이언트의 모든 필드를가집니다 (하위 객체는 무시합니다). 장면 뒤에서 어떤 작품이 작동하는지 생각해 보면 모든 그림이 분명해진다. – helios

1

이것은 느린 로딩입니다. 누군가가 요청할 때만 스트림을 생성합니다. 필요하지 않으면 스트림 (귀하의 경우 목록)을 생성하지 않습니다.

필요할 때까지 사용하지 않기 때문에 메모리를 절약 할 수 있습니다. 따라서 스트림을 사용하기 전에 할당 된 메모리가 없습니다.

1

편집 결과에 List<byte[]> 대신 object 키워드 대신 속성 유형이 메모리를 저장하는지 여부를 묻는 메시지가 나타나면 아니오를 입력하십시오. 그리고 if 블록은 속성이 처음 호출 될 때까지까지 무시할 수있는 양의 메모리 (및 인스턴스화시 CPU) 만 저장합니다. 그리고 그것은 그 속성에 대한 첫 번째 호출을 약간 느리게 만듭니다. 속성에 대해 의미가있는 경우 null을 반환하는 것을 고려하십시오. 그리고 다른 답변자가 제안한 것처럼, 다른 클래스가 변경하려고하지 않는 한 속성을 읽기 전용으로 유지하는 것이 좋습니다. 일반적으로, 나는 이런 식의 최적화 시도가 대부분 잘못된 것이라고 생각하고 코드 유지 관리가 쉽지 않다고 말한다.

+0

감사, 좋은 지적 – Skawful