2012-08-13 3 views
1

가비지 수집 기능이있는 기본 POC VM을 개발 중입니다. 내가 사용하고있는 언어는 바이트 배열을 VM의 메모리로 사용하고있는 C#입니다. .net GC로 이동하지 않고 동적으로 메모리 크기를 늘릴 수 있습니까?동적으로 C#에서 고정 배열의 크기를 늘리는 방법은 무엇입니까?

내가 나중에 코드에서 _memory을 크기 다시하려면 내가 사용하고 코드는

byte[] _memory = new byte[2048]; 
var _gcHandle = GCHandle.Alloc(_memory, GCHandleType.Pinned); 
var _memHandler = _gcHandle.AddrOfPinnedObject(); 

매우 간단합니다, 나는 그것을 고정 해제하지 않고 어떻게 그렇게 할 것인가? 다른 기술을 사용해야합니까?

답변

1

아니요. 만약 당신이 그것에 대해 생각한다면, 믿을 수 없게 할 수 없습니다.

메모리 청크 상상

들은 동일한 설정된다

[some_string] _ 메모리 [boxed_int32] some_URI]

그런 다음 그것을 움직이지 않고 _memory 크기 다시 불가능하다.

가능한 한 최선의 결과를 얻으려면 가능한 경우 해당 위치에서 크기를 조정해야하는 전화가 필요합니다. 그렇지 않으면 실패합니다. 복사를 통해 크기를 다시 조정하거나 필요한 경우 복사를 수행하고 어떤 접근 방식이 효과가 있었는지).

그렇기 때문에 가능한 것은 아니지만 최적화로서 가능한 경우를 잡는 것은 어떨까요? [some_URI]가 (가) 평균 시간에 수집 된 경우에는 어떻게됩니까?

슬프게도 (대부분 앱의 코드를 포함하여 대다수의 코드가 유용 할지라도), 이것은 비교적 드문 경우를위한 최적화로 작동하지 않습니다. 이미 전체 메모리 관리를위한 최적화가 GC는 분열을 줄이기 위해 간격이있는 경우 해당 위치로 물건을 이동시킵니다. 배열을 고정하면 배열을 이동하기에 덜 효율적이게됩니다 (배열 전에 공간을 작게 만들지 않았을 가능성이 있기 때문입니다).

어레이가 LOH에있는 경우, 사용되지 않은 공간은 사용되지 않았을 가능성이 높지만 해제 된 가능성은 낮습니다.

이런 종류의 re-malloc이 이론적으로는 때때로 작동 할 수 있지만, 주어진 시간 동안 작동하는 확률은 너무 작아 구현할 가치가 없습니다.

3

나중에 코드에서 _memory의 크기를 조정하려는 경우이를 고정 해제하지 않고 어떻게 처리 할 수 ​​있습니까?

신뢰할 수있는 방법이 없으며이를 수행하는 데 관리 API가 필요하지 않습니다. 문제는 일단 메모리가 고정되면 움직일 수 없다는 것입니다. 배열 크기를 조정하면 다른 위치에서 할당을 수행해야 할 수 있습니다 (현재 위치에서 연속적인 메모리 덩어리가 충분하지 않기 때문에).

이와 같이, 메모리를 고정 해제하고, 재 할당/크기 조정 한 다음 새 고정 배열을 만들어야합니다. 메모리를 보유하고있는 모든 원시 코드 (첫 번째 위치에 고정시키는 이유)가 이전 메모리 위치를 사용하지 않도록 업데이트되었는지 확인하십시오.

3

C#에서는 배열의 크기를 다시 지정할 수 없습니다 (고정되었는지 여부는 관계 없음). 원하는 크기의 새로운 배열 만 만들 수 있습니다.

새 배열을 만들면 이전 배열이 고정 된 위치에 고정시킬 방법이 없습니다.

관련 문제