C 메모리 할당 함수의 대부분의 구현은 각 블록에 대한 계정 정보를 인라인 또는 개별적으로 저장합니다.
한 가지 일반적인 방법 (인라인)은 실제로 요청한 메모리와 헤더를 모두 최소 크기로 채우는 것입니다. 예를 들어, 20 바이트를 요청하면 시스템은 48 바이트 블록을 할당 할 수 있습니다.
- 크기, 특수 마커, 체크섬, 다음 / 이전 블록에 대한 포인터 등을 포함하는 16 바이트 헤더.
- 32 바이트 데이터 영역 (20 바이트는 16의 배수로 채워짐)
귀하에게 제공된 주소는 데이터 영역의 주소입니다. 그런 다음 블록 free
을 비울 때 단순히 주소를 지정하고 해당 주소 나 주변 메모리를 채우지 않았다고 가정하면 회계 정보를 바로 확인하십시오. 그래픽으로 보면 다음과 같습니다.
____ The allocated block ____
/ \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
^
|
+-- The address you are given
헤더와 패딩의 크기는 완전히 구현 정의되어 있습니다 (실제로 전체가 구현 정의 되어 있지만 (a) 인라인 회계 옵션이 일반적입니다).
계정 정보에 존재하는 체크섬 및 특수 마커는 종종 "메모리 아레나 손상"또는 "더블 프리"와 같이 오류를 덮어 쓰거나 두 번 해제하면 오류의 원인이됩니다.
패딩 (할당을보다 효율적으로 만들기 위해)은 때때로 문제를 일으키지 않고 요청 된 공간의 끝을 약간 넘어 쓸 수있는 이유입니다 (여전히 그렇게하지 마십시오. 정의되지 않은 동작이며 때로는 작동하기 때문에 작동하지 않습니다) t는 괜찮습니다).
(a)malloc
128 바이트 이하를 요청했다고 가정 할 때 (시스템에서 가장 큰 구조의 크기 인) 128 바이트를 갖는 임베디드 시스템에서 구현을 작성 했습니다 (더 많은 요청은 NULL 반환 값을 충족해야합니다. 128 바이트 청크의 할당 여부를 결정하기 위해 매우 간단한 비트 마스크 (즉, 인라인이 아닌)가 사용되었습니다.
내가 개발 한 다른 사람들은 16 바이트 청크, 64 바이트 청크, 256 바이트 청크 및 1K 청크에 대해 다른 풀을 사용했으며 비트 마스크를 사용하여 다시 사용하거나 사용 가능한 블록을 결정했습니다.
이 두 옵션은 회계 정보의 오버 헤드를 줄이고 속도 증가 관리 malloc
및 free
우리가 작업하던 환경에서 특히 중요합니다 (해제 할 때 인접한 블록을 병합 할 필요).