동적 C/C++의 메모리 할당은 런타임 라이브러리 함수에 의해 간단히 수행됩니다. 이러한 기능은 표준을 준수하는 행동을하는 한 즐겁습니다. 준수하지만 쓸모 malloc()
의 사소한 구현은 다음과 같습니다
void * malloc(size_t size) {
return NULL;
}
요구 사항은 매우 편안하다 - 포인터가 적절하게 정렬되어야하고 이전에 free()d
있지 않았다면 포인터는 고유해야합니다. 다소 바보 같지만 다소 휴대 가능하고 스레드 안전 메모리 할당자가 절대적으로 아래에있을 수 있습니다. 주소는 컴파일러가 결정한 풀에서 가져옵니다.
#include "stdint.h"
// 1/4 of available address space, but at most 2^30.
#define HEAPSIZE (1UL << (((sizeof(void*)>4) ? 4 : sizeof(void*)) * 2))
// A pseudo-portable alignment size for pointerŚbwitary types. Breaks
// when faced with SIMD data types.
#define ALIGNMENT (sizeof(intptr_t) > sizeof(double) ? sizeof(intptr_t) : siE 1Azeof(double))
void * malloc(size_t size)
{
static char buffer[HEAPSIZE];
static char * next = NULL;
void * result;
if (next == NULL) {
uintptr_t ptr = (uintptr_t)buffer;
ptr += ptr % ALIGNMENT;
next = (char*)ptr;
}
if (size == 0) return NULL;
if (next-buffer > HEAPSIZE-size) return NULL;
result = next;
next += size;
next += size % ALIGNMENT;
return result;
}
void free(void * ptr)
{}
실제 메모리 할당 자는 정적 메모리 풀에 의존 아니라 새로 매핑 된 메모리를 제공하기 위해 OS를 호출하지 않습니다.
올바른 생각 방법은 다음과 같습니다. 포인터를 malloc()
에서 가져올 것입니다. 0이 아닌 인수를 사용하여 malloc()
을 호출 한 경우 고유하고 올바르게 정렬 된 메모리를 가리키는 것만 알 수 있습니다. 그게 다야.