LINUX.ORG.RU

[СИ] malloc.

 


1

2

[СИ] malloc.

Язык СИ
ОС UNIX

Осваиваю malloc.

Действительно, чего я его боялся? По утечке памяти.

Я, бывало, спотыкался на незакрытии файлов в не разовых процессах
(демонах). Но теперь немало преуспел в деле закрытия файлов.
И это умение легко перенести на malloc.

Вопрос-1.
Если я в некоторой функции определю переменную так
static char buf[100];
то когда под нее будет выделена память - сразу при
запуске программы, или при первом вызове функции?
И можно ли такую функцию использовать рекурсивно?
Как я понимаю, нельзя.

Вопрос-2.
Выделяет ли malloc() память побайтно или страницами?
Если страницами, то неэкономично для маленьких переменных.
Если побайтно, то трудно представить, как тогда работает realloc.
В книге Стивенса описан mmap, а не malloc. Но я подозреваю,
что они родственные.

Кто знает прошу ответить.


Вроде malloc выделяет сначала n байт, потом, когда закончатся - 2n, потом 4n, 8n и т.д. Рекурсивная функция со статической переменной возможна, но значение переменная будет общей для всех вызовов.

gentoo_root ★★★★★
()
Ответ на: комментарий от anonymous

Это Денис Ритчи пишет нам из прошлого. Денис! Пожалуйста, предусмотри в метаданных файловой системы юникса поле для mime-типа. Ты ещё не знаешь что это такое, его придумают не раньше 1982, но поверь, это полезная штука.

legolegs ★★★★★
()

Неужели нельзя маны покурить?

Normally, malloc() allocates memory from the heap, and adjusts the size of the heap as required, using sbrk(2). When allocating blocks of memory larger than MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory as a private anonymous mapping using mmap(2).

Так что, если в «куче» места не хватит, то используется mmap, про который вы у Стивенса и читали. А в «куче» выделяется ровно столько, сколько надо (+ чтобы данные были правильно выровнены).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от legolegs

А разве Ритчи написал модуль для работы с ext, да и всю идеологию этой ФС?

Eddy_Em ☆☆☆☆☆
()

>static char buf[100];

Память будет выделена при старте.

И можно ли такую функцию использовать рекурсивно?

Можно, никаких проблем, просто надо помнить, что buf будет один на все вызовы функции.

Выделяет ли malloc() память побайтно или страницами?

Побайтно, подробности зависят от реализации. Часто округляют до 2^X байт.

трудно представить, как тогда работает realloc.

Чё там трудного? Если после данных есть место - оно помечается как занятое. Если нет - данные переносятся.

legolegs ★★★★★
()
25 февраля 2011 г.
Ответ на: комментарий от Eddy_Em

>А при чем здесь UNIX? Фря «отпочковалась» от systemIV, ЕМНИП.

А при чём тут фря? ЕМНИП её ещё вообще не было, когда произошло почкование.

morbo
()

Некрофилю.

static char buf[100];

Изучаем формат ELF.

Выделяет ли malloc() память побайтно или страницами?

Пишем программки и смотрим на вывод strace.

sv75 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.