문제

나는 간단한 증분 힙 올로이터가 간단한 압축 벼랑과 함께 사용되는 자체 해체 메모리 관리자를 작성하려고합니다.

거친 체계는 가장 낮은 메모리 주소에서 시작하여 위로 올라가는 블록을 할당하고 서점 정보가 가장 높은 메모리 주소에서 아래쪽으로 작동하는 것을 유지하는 것입니다.

메모리 매니저는 스마트 포인터를 다시 통과시킬 것입니다. Boost의 Intrusive_ptr 's는 부기 유지 스트러크에게 가장 분명해 보인다. 그러면 실제 메모리 블록을 가리키면 차단 레벨을 제공하여 블록을 쉽게 이동할 수 있습니다.

DEFRAGMENTER는 'Generation'북마크에서 시작하여 힙을 콤팩트하여 프로세스 속도를 높이고 한 번에 고정 된 양의 메모리 만 훼손합니다. 블록 자체에 대한 원시 포인터는 다음 DEFRAG 패스까지 유효하므로 성능이 향상 될 때까지 자유롭게 전달 될 수 있습니다.

이를위한 특정 응용 프로그램은 콘솔 게임 프로그래밍이므로 각 프레임의 시작 또는 끝에서 DEFRAG 패스는 비교적 안전하게 수행 될 수 있습니다.

따라서 내 질문은 누구나 STL과 함께 이런 종류의 할당 체계를 사용한 사람이 내가 의심하는 것처럼 STL을 완전히 날려 버릴 것입니다. 나는 std :: list <siprusive_ptr> intrusive_ptr 수준에서 작동하는 것을 볼 수 있지만 STL 목록 노드 자체의 할당은 어쨌든 다음/이전 포인터를 Intrusive_ptr의 자체로 무시할 수있는 것은 어떻습니까? 표준 힙 할당 자와 함께이보다 역동적 인 것.

도움이 되었습니까?

해결책

메모리에서 객체를 움직이려고한다면 전체적으로 완전히 수행 할 수 없습니다. 당신은 알다 그들이 움직일 수 있습니다. 또한 잠금 장치가 필요합니다. 객체에서 함수가 호출되면 이동할 수 없습니다.

그 이유는 전체 C ++ 모델이 메모리의 고정 지점에 앉아있는 객체에 의존하기 때문에 스레드가 객체의 메소드를 호출하는 경우이 스레드가 일시 중지되고 객체가 움직이면 스레드가 재개 될 때 재난이 발생합니다.

움직일 수있는 다른 객체에 대한 원시 메모리 포인터를 보유한 모든 객체 (하위 객체 포함)는 작동하지 않습니다.

이러한 메모리 관리 체계는 작동 할 수 있지만 매우 조심해야합니다. 손잡이 구현 및 핸들-> 포인터 잠금 시맨틱을 엄격해야합니다.

STL 컨테이너의 경우 할당자를 사용자 정의 할 수 있지만 고정 된 원시 메모리 포인터를 반환해야합니다. 이동할 수있는 주소를 반환 할 수 없습니다. 이러한 이유로 STL 컨테이너를 사용하는 경우 핸들 컨테이너 여야하며 노드 자체는 동적으로 할당 된 메모리가됩니다. 핸들 간접에 오버 헤드가 너무 많아서 STL을 사용하여 얻는 것보다 핸들 컬렉션의 조각화에 여전히 문제가 있음을 알 수 있습니다.

손잡이를 직접 이해하는 컨테이너를 사용하면 앞으로 나아갈 수있는 유일한 방법 일 수 있으며, 메모리에 고정 된 기존 객체를 사용하는 C ++ 응용 프로그램에 비해 여전히 많은 오버 헤드가있을 수 있습니다.

다른 팁

STL 컨테이너는 알몸 포인터를 사용하여 구현됩니다.

인스턴스화 할 때 사용자 정의 할당자를 지정할 수 있습니다 (따라서 할당자를 사용하여 포인터를 초기화합니다). (할당 된 값은 알몸 포인터에 저장되어 있기 때문에) 해당 포인터가 어디에 있는지 알 수 없으므로 할 수 없습니다. 나중에 변경하십시오.

대신 STL의 서브 세트를 직접 구현하는 것을 고려할 수 있습니다. 그런 다음 STL 컨테이너 버전을 관리 포인터로 구현할 수 있습니다.

상당히 잘 알려진 대체 기술은 버디 시스템. 추가 영감을 얻으려면이를 살펴 봐야합니다.

이것이 콘솔 게임 프로그래밍을위한 것이라면 런타임에서 스코핑되지 않은 동적 메모리 할당을 금지하는 것이 훨씬 쉽습니다. 그리고 시작 시간에는 달성하기가 약간 어렵습니다.

이것에 대한 나의 생각은, 단편화를 두려워해야한다면, 당신은 당신이 당신의 기억의 많은 부분 인 데이터 조각으로 저글링하고 있다는 것을 의미하며,이 미덕만으로는 많은 것을 가질 수 없습니다. 당신은 이것들이 무엇인지 이미 알고 있습니까? 어쩌면 수준을 낮추고보다 구체적인 결정을 내리는 것이 더 나을 것입니다. 따라서 다른 코드와 응용 프로그램의 일반적인 성능에 덜 방해할까요?

목록은 대부분의 다른 STL 데이터 구조와 마찬가지로 작은 조각이기 때문에 메모리 관리자를 배출하는 데 예외적으로 나쁜 예입니다. 이렇게한다면, 배출 자의 성능, 또한 간접 비용 등을 포함하여 모든 종류의 명백한 나쁜 영향을 미칩니다. , 그런 것들, 그리고 특정 크기를 넘어서만 더 이상 크기를 조정하지 않을 것입니다. 이러한 종류의 것들은 일반적인 솔루션 대신 특정 솔루션을 위해 다시 전화합니다.

그것이 어떻게 나오는지에 대해 다시 언급하십시오.

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