2015-09-21 2 views
7

я был под впечатлением, что alloc в Objective-C (когда мы вызываем [anyObject alloc] фактически реализует функцию malloc C и память получать выделенной в куче, но не мог найти где-нибудь ответ на это.alloc, malloc и alloca - В чем разница?

Кроме того, при поиске для alloc, я нашел alloca который выделяет память в стеке. Если я не ошибаюсь, alloc выделяет память в куче для создания объектов.

Итак, в чем разница между alloc и mallocalloca)? Может кто-нибудь пожалуйста, обобщать ?

ответ

15

alloc() не является стандартной библиотекой C-библиотеки. Некоторые старые компиляторы и библиотеки содержат библиотеку <alloc.h>, которая предоставляет некоторые функции выделения памяти, но это не является стандартом. Среда выполнения Microsoft Visual C++ включает в себя функцию Alloc(), которая несколько похожа на malloc(), но это также не является частью стандарта C.

malloc() выделяет память на кучу процесса. Память, выделенная с использованием malloc(), останется на куче до тех пор, пока она не будет освобождена с использованием free().

alloca() выделяет память в стеке текущей функции. Память, выделенная с использованием alloca(), будет удалена из стека, когда текущая функция вернется. alloca() ограничен небольшими выделениями.

Ситуации, в которых alloca() уместны, встречаются редко. Почти во всех ситуациях вы должны использовать malloc() для выделения памяти.

+2

«Ситуации, в которых подходит alloca(), встречаются редко. Почти во всех ситуациях вы должны использовать malloc() для выделения памяти». Нет. Все 'alloca()' is предоставляет массивы переменной длины. Нет никакой практической разницы между 'int n = 6; double x [n]; 'и' int n = 6; double * x = alloca (n * sizeof (* x)); 'Не только это, использование' malloc() 'в многопоточных программах может быть серьезным узким местом производительности. –

+0

Мой запрос был больше с точки зрения Objective-C, который реализует '[[someObject alloc] init]' для выделения памяти и инициализации объекта в куче. Этот '[someObject alloc]' реализует 'malloc' в фоновом режиме? –

+6

@AndrewHenle Я не сказал, что есть * no * ситуации, где 'alloca()' подходит; Я сказал, что они редки. VLA - один из тех случаев, когда они полезны, но даже там они по сути являются оптимизацией. Поскольку ОП явно не знаком с программированием на С, я решил не углубляться в детали. :) – duskwuff

0

Функция alloc используется для выделения области или блока размера байтов в длину heap.

Функция malloc используется для распределения heap хранения. Его имя означает выделение памяти.

+0

Пожалуйста, посмотрите на это [URL] (http://stackoverflow.com/help), это будет полезно поднять ваше качество вверх –

Смежные вопросы