Если malloc вызывает функцию VirtualAlloc () для выделения памяти (которая выделяет минимум 4Kb), как malloc выделяет 4 байта для int?
malloc
запрашивает память у ОС в кратных размер страницы (очевидно, так как размер страницы по определению является квантом выделенной памяти) и передает его вам небольшими порциями.
Это не отличается от того, что делают все распределители памяти — фактически специализированные распределители памяти (например, Boost.Pool
) которые используют malloc
негласно сделайте это еще раз: они выделяют больший кусок памяти через malloc
и раздать его вам по кусочкам.
Приложение, над которым я работаю, внутренне использует реализацию malloc.c от Дуга Ли (ftp://g.oswego.edu/pub/misc/malloc.c), он широко используется на многих платформах.
Эта реализация забирает память из системы, в случае Windows в кусках по 64 КБ, зарезервированных и зафиксированных с использованием VirtualAlloc. Затем он использует различные алгоритмы и структуры для максимально эффективного использования этой памяти.
Я протестировал распределение 2 байтов, и из отладчика я вижу, что он сначала дополняет его до 4 байтов и помещает его в SmallBins — это способ обработки небольших выделений памяти. В итоге я вижу, что реальное использование памяти в этом распределении составляет 16 байт. Но это, вероятно, зависит от платформы.