2010-04-19 2 views
0

임베디드 유형 시스템에서 표준 메모리 할당 시스템 위에 피기 백하는 작은 객체 할당자를 만들었습니다. 이 할당자는 Boost :: simple_segregated_storage <> 클래스이며 내부 조각화가 발생하여 작은 객체에 대한 O (1) alloc/dealloc 시간을 정확하게 필요로합니다. 내 질문은 그것을 선언하는 것이 최선의 방법입니다. 지금 당장은 mem 코드 모듈에 선언 된 스코프 스태틱 (static)입니다. 괜찮습니다.하지만 조금 노출 된 느낌이 들었습니다. 이제는이 모듈과 영원히 연결되어 있습니다. 일반적으로 monostate 또는 singleton으로 선언하지만 동적 메모리 할당자를 사용합니다 (이 위치에 동적 메모리 할당자가 사용됩니다). 또한 정적 객체 초기화가 시스템에서 발생하기 전에 동적 메모리 할당자가 초기화되고 사용됩니다. 메모리 관리자는 엔진의 가장 기본적인 구성 요소입니다.)이 catch 22를 해결하기 위해 작은 객체 할당자가 아직 존재하는지 확인하기 위해 '작은 메모리 할당자가 있으면'추가했습니다. 그것은 이제 모든 작은 객체 할당에서 실행되어야합니다. 사물의 계획에서 이것은 거의 무시할 수 없지만 여전히 괴롭습니다.디자인 : 특수 메모리 핸들러 클래스를 선언하는 방법

메모리 모듈에서이 부분을 분리하고 여분의 isinitialized() if 문을 사용하지 않는 데 도움이되는 메모리 관리자의이 부분을 선언하는 것이 더 좋은 방법일까요? 이 방법이 동적 메모리를 사용하는 경우 관리자의 작은 객체 부분의 초기화 부족을 해결하는 방법을 설명하십시오.

+0

저는 ARM에서 이러한 것을 설계하는 데 많은 시간을 할애하고 있습니다. 필자가 본 라이브러리는 RAM이 8K 이하인 시스템에서는 실제로 설계되지 않았습니다. 속도가 중요하지 않다면, 가비지 수집 문자열/배열 클래스가 많은 사용 시나리오에서 일반 라이브러리의 절반 이하의 RAM을 필요로 할 것이라고 예상 할 수 있습니다 (예 : 외부 참조는 관리 배열의 uint16_t 인덱스입니다). 작은 참조 또는 원시 바이트 배열에는 2 바이트의 오버 헤드가 있고 참조에는 각각 2 바이트가 사용되며 큰 배열에는 약 4 %의 추가 오버 헤드가 발생합니다. – supercat

+0

그런 디자인이 합리적인 아이디어처럼 보입니까? 다 끝났습니까? – supercat

답변

1

좋은 가이드 라인은 : 그렇지 않으면 좋은 이유가없는 한, 당신이 의미하는 바를 말합니다. 이 할당자는 전역 정적 객체이므로이를 선언해야합니다. 이제 상태 초기화가 필요하다면, 동적 메모리 할당자를 초기화하는 코드에서 그렇게 할 것입니다. 실제로 이것은 메모리 할당 시스템을 초기화하는 작업의 일부이기 때문에 다시 말하면 여러분이 의미하는 바를 말합니다. 그러면 모든 호출에 대한 부질없는 조건부 검사를 피할 수 있습니다.

+0

내가 할 수없는 이유가 있었지만, 나는 무엇을 기억하지 못합니다. 나는 내 코드를 다시 확인하고 다시 연락 할 것이다. –