Malloc
returns a pointer to a block memory of at least size bytes that is suitably aligned
Malloc
returns NULL and sets errno
when progrma requests a block of memory that is larger than the available virtual memory.
Malloc
does not initialize the memeory. 초기화 해야하면 either calloc. 이미 할당된 블락의 사이즈를 변경하고 싶으면 realloc.
말록과 같은 Dynamic memory allocators는 mmap
과 munmap
function을 사용하거나 sbrk function을 사용해서 힙 메모리를 명시적으로 할당할 수 있다.
sbrk
함수는 커널의 brk 포인터에 incr
을 추가하면서 힙을 늘리거나 줄일 수 있다. 성공하면 brk의 옛날 값을 리턴하고 실패하면 1과 ENOOMEM의 errno
을 세팅한다.
sbrk
함수 자체는 반환 값이 힙의 새로운 끝을 가리키며 실패할 경우 (void *)-1을 반환합니다.
allocators can't control number of size of allocated blocks 라는 말이 잘 이해되지 않아서 지피티에게 물어봤더니 아래와 같이 대답했다.
malloc
은 C 언어에서 동적으로 메모리를 할당하는 함수입니다. 이 함수를 사용하면 프로그램 실행 중에 필요한 만큼의 메모리를 할당할 수 있습니다. 그러나malloc
은 할당된 블록의 크기를 정확하게 제어하는 데 어려움이 있습니다.
malloc
으로 할당되는 블록의 크기는 사용자가 요청한 크기와 비슷하지만, 할당된 메모리의 정확한 크기를 예측하거나 제어하기 어렵습니다. 이는 메모리 할당자가 내부적으로 효율적으로 메모리를 관리하기 위해 추가적인 정보를 블록에 저장하기 때문입니다. 이 정보에는 할당된 블록의 크기 외에도 할당자가 내부적으로 사용하는 메타데이터 등이 포함됩니다.
즉,malloc
을 사용하면 할당된 블록의 크기를 정확히 예측하기 어렵습니다. 이는 사용자가 할당된 메모리 블록의 크기를 미리 알 수 없다는 것을 의미합니다. 때문에 메모리를 할당할 때 얼마나 많은 공간이 할당되었는지 정확하게 파악하기 어려울 수 있습니다.
이러한 이유로, 메모리 블록의 크기를 정확하게 제어하고자 할 때는malloc
대신에calloc
또는realloc
등을 사용하는 것이 더 적절할 수 있습니다.
이해하자면, malloc을 사용하면 프로그래머가 원하는 사이즈만큼 메모리를 할당해주지만, 사실 말록은 할당하는 블록의 크기를 정확하게는 제어할 수 없기 때문에 요청된 크기와 비슷하게 블록 크기를 준다는 것이다.
이러한 이유는 할당된 블록의 크기 외에도 allocator가 내부적으로 사용하는 메타데이터 등이 포함되기 때문이라고 한다.
그래서 말록을 사용하면 얼마나 많은 공간이 할당되었는지 정확하게는 파악하기 어렵고, 만약 메모리 블록 크기를 정확하게 제어해야 할 때에는 malloc
대신에 calloc
realloc
을 사용하는것이 적절하다고 한다.
메모리 할당자가 할당된 블록을 정렬하여 해당 블록이 하드웨어나 운영 체제의 정렬 요구 사항을 만족하도록 한다는 의미입니다.
말 뜻을 풀어서 이해하면 정렬 조건에 맞춰서 블락을 정렬 해야한다. 이게 무슨 말이냐면 예를들어 몇몇 하드웨어 아키텍처에서는 4바이트 정수는 항상 4의 배수 주소에 위치해야 하거나, 8바이트 정수는 8의 배수 주소에 위치해야 하는 경우가 있습니다.