Существует ли библиотека или реализация malloc, которая выделяет память в куче как / как в стеке? - PullRequest
0 голосов
/ 29 ноября 2011

Мне нужно получить кучу памяти большими кусками. И эти фрагменты памяти будут использоваться в качестве пулов памяти и не будут освобождены до завершения процесса. Таким образом, традиционный malloc может быть не так прост (и не так быстр), как я хочу. Я думаю, что стек-подобное распределение (LIFO) будет более эффективным, чем malloc.

Существуют ли какие-либо библиотеки, способные сделать это? Или я должен написать новый для этой цели?

PS: Я думаю, obstack лучше всего описывает то, о чем я говорю. Любой другой кандидат или введение о obstack?

Ответы [ 3 ]

1 голос
/ 29 ноября 2011

Слушайте, как все говорят, что сначала просто используйте malloc, но если вам действительно нужен распределитель на основе региона, который может освобождать вещи большими кусками, обратитесь к библиотеке Apache Portable Runtime.

0 голосов
/ 29 ноября 2011

malloc вызывает замедление, когда он вызывается снова и снова, как в середине тройного вложенного цикла. Если вы выделяете несколько больших блоков с помощью malloc и держите их в течение длительного времени, вы уже используете malloc эффективно.

Например, предположим, что вы работаете с трехмерными точечными данными, и у вас есть struct Point. Если вы работали с массивом Point ** и выделяли каждой точке по отдельности, например:

for (int i = 0; i < size; ++i)
    points[i] = malloc(sizeof(struct Point));

это будет медленно. Но работая с блоком struct Point вместо struct Point *, вы заранее определяете размер и вызываете malloc только один раз.

points = malloc(sizeof(struct Point) * size);

Это нормально, потому что malloc запускается только один раз.

0 голосов
/ 29 ноября 2011

Из Википедия :

В C библиотечная функция malloc используется для выделения блока памяти в куче.

malloc будет достаточно просто и быстро.

Кроме того, что это значит?

Я думаю, что все будет в порядке, если расценивать выделение памяти кучи как путь в стеке.

Если вы хотите использовать пространство стека для своего пула памяти, вы будете разочарованы. Размер стека обычно составляет всего несколько МБ (точный размер зависит от компьютера и компилятора). Возможно, у вас есть свои идеи стека и кучи назад? В стеке идут фреймы функций с аргументами и локальными переменными; куча - это место, куда направляется постоянная, динамически выделяемая память.

...