2015-01-29 4 views
1

나는 핸들 클래스와 내가 생성 한 클래스 객체의 핸들 사본을 여러 개 저장하는 배열을 가지고있다. (때로는 최대 1000 개의 단일 핸들 사본). 객체 자체에 대한 핸들이 메모리를 거의 사용하지 않는다고 가정했습니다.Matlab 핸들 클래스 핸들 크기

게시물에서 http://es.mathworks.com/matlabcentral/newsreader/view_thread/255117 누군가가 핸들이 4 바이트라고 언급했습니다. 그러나 내가 객체 핸들에 whos을하면 나는 112 바이트를 얻는다. 현재 응용 프로그램에 너무 많은 것입니다. 이게 정상인가?

그럼 메모리 사용량을 어떻게 낮추시겠습니까? 핸들 (container.map)을 uint32 번호 (4 바이트)에 매핑 한 다음 해당 번호를 사용하여 핸들 복사본 배열에 표현할 수있는 솔루션을 상상할 수 있습니다. 비록 내가 객체를 통해 데이터를 얻고 싶을 때마다 매핑을 진행해야하기 때문에 약간 더러워졌습니다.

더 좋은 아이디어가 있습니까? 감사합니다. 예 요청에 따라

:

classdef Test < handle 
end 

>> z = Test(); 
>> whos z 
    Name  Size   Bytes Class Attributes 
    z   1x1    112 Test 
>> y = [z z z z z z z z z]; %an array of copies of the handle 

그러나이 날 혼란 :

>> y = [z z z]; 
>> whos y 
    Name  Size   Bytes Class Attributes 
    y   1x3    128 Test    

>> y = [z z z z]; 
>> whos y 
    Name  Size   Bytes Class Attributes 
    y   1x4    136 Test 
+1

좋은 질문입니다. 우리가 당신의 질문에 대답하는 데 도움이되는 약간의 자급 자족 한 예가있을 수 있습니까? –

+0

어떤 MATLAB 버전을 사용하고 있습니까? ML2013a 32 비트는 기본 클래스의 경우 56 바이트이고 핸들의 경우 4 바이트입니다. 귀하의 경우 핸들 8 바이트 및 기본 클래스 108 바이트 것으로 보인다. – Daniel

+0

* 기본 클래스는 104 바이트가 아니고 108 – Daniel

답변

2

Whos는 4 바이트는 참조를 포함하는 객체의 크기를 표시한다. 개체 자체는 108 바이트이고 핸들은 다른 4 바이트를 추가하지만 108 바이트는 공유됩니다. 할당 된 총 메모리를 얻기 위해 메모리를 요약 할 수는 없습니다.

y의 크기를 살펴보십시오. numel (y) * 4 + 108

+0

아, 핸들이 8 바이트 인 것만 제외하면 옳은 것 같습니다. 그래서 112 - 8 = 104. 4 * 8 + 104 = 136 마지막 예와 같습니다. 그래서 핸들 자체가 8 바이트라고 말하고 있습니다. 이상한 것은 배열의 모든 것들이 104 바이트를 포함한다는 것입니다. v라는 두 번째 객체를 만들어 배열에 추가하면 어떻게 될까요? 나는 104 + 104 + 마디 (y) * 8을 가질 것인가? – Stefan