문제

내 응용 프로그램은 주로 구성되어 있습니다 레이어 그래서 나는 그와 같은 것을 발견했습니다 APR 메모리 풀 가장 좋은 방법이 될 것입니다.

에 대해 읽는 동안 C++ placement new 게시물 여기 & 여기, 그리고 보다 일반적인 C 할당 질문 나는 하나의 게시물에서 제안 된대로 계층 적 풀 할당자를 수동으로 제작하는 것에 대해 생각하고 있었지만 순수한 NYI 전통에서 먼저 이런 것이 이미 존재하는지 묻습니다.

또한 사용하지 않은 메모리를 OS에 돌려 줄 수있는 멋진 속성을 가질 수 있습니다 (할당 할 수 있기 때문에 mmap(MAP_ANON)) 또는 그럴 수도 있습니다 스택에서 할당 제안 된대로 페루 시코 여기.

도움이 되었습니까?

해결책

나는 또 다른 좋은 계층 적 메모리 할당자를 알고 있지만 malloc 덮개 아래.

TALLOC 소멸자가있는 계층 적 풀 기반 메모리 할당 자입니다. SAMBA4에 사용되는 핵심 메모리 할당 자이며 SAMBA4 개발의 여러 측면에서 큰 차이를 만들었습니다.

Talloc을 시작하려면 Talloc 가이드.

그 말은 glibc입니다 malloc 이미 사용합니다 mmap(MAP_ANON) 할당보다 큰 mmap_threshold, 당신은 그것을 통해 설정할 수 있습니다 mallopt(M_MMAP_THRESHOLD, bytes). 기본적으로 사이에서 동적으로 조정됩니다

/*
  MMAP_THRESHOLD_MAX and _MIN are the bounds on the dynamically
  adjusted MMAP_THRESHOLD.
*/

#ifndef DEFAULT_MMAP_THRESHOLD_MIN
#define DEFAULT_MMAP_THRESHOLD_MIN (128 * 1024)
#endif

#ifndef DEFAULT_MMAP_THRESHOLD_MAX
  /* For 32-bit platforms we cannot increase the maximum mmap
     threshold much because it is also the minimum value for the
     maximum heap size and its alignment.  Going above 512k (i.e., 1M
     for new heaps) wastes too much address space.  */
# if __WORDSIZE == 32
#  define DEFAULT_MMAP_THRESHOLD_MAX (512 * 1024)
# else
#  define DEFAULT_MMAP_THRESHOLD_MAX (4 * 1024 * 1024 * sizeof(long))
# endif
#endif

당신이 그것을 낮추면 조심하십시오. 기본적으로 그 이상 #define DEFAULT_MMAP_MAX 65536 조각은 사용하여 할당됩니다 mmap. 이것은 변경 될 수 있습니다 mallopt(M_MMAP_MAX, count), 그러나 많은 것을 사용합니다 mmapS에는 오버 헤드가 있습니다.

환경 변수 MALLOC_MMAP_THRESHOLD_ 등 도이 옵션을 설정합니다.

분명히, 기억 malloc 할당됩니다 mmap 함께 해방됩니다 munmap. 이 중 어느 것도 GLIBC 소스 코드 외부의 어느 곳에도 문서화되어 있는지 또는 호환성 보장이 있는지 확실하지 않습니다.

다른 팁

데이브 핸슨 C 인터페이스 및 구현 신중하게 조정 된 단일 풀 할당자가 있습니다. 당신은 그것들을 서로 연결하여 계층 적 할당자를 만들 수 있습니다.

하다 메모리 관리가 중요한 병목 현상이라는 프로파일 링 결과가 있습니까? 아니면 배정을 위해 API를 단순화하려고합니까?

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