2015-09-21 11 views
7

私たちは[anyObject alloc]が実際にCの関数mallocとヒープに割り当てられたばかりのメモリを実装しているが、どこにも、このための答えを見つけることができませんでした。alloc、malloc、およびalloca - 違いは何ですか?

また、検索中のObjective-C(中alloc呼び出すという印象の下にありましたallocのために、私は、スタック内のメモリを割り当てallocaを見つけました。私は間違っていないよ場合は、allocは、オブジェクトを作成するために、ヒープにメモリを割り当てますので

allocmalloc(とalloca)の違いは何?誰がまとめてくださいすることができ?

答えて

15

alloc()は標準のCライブラリ関数ではありません。いくつかの古いコンパイラとライブラリには、メモリ割り当て関数を提供する<alloc.h>ライブラリが含まれていますが、これは標準ではありません。 Microsoft Visual C++ランタイムにはAlloc()関数が含まれており、これはmalloc()と多少似ていますが、これもC標準の一部ではありません。

malloc()は、プロセスヒープにメモリを割り当てます。 malloc()を使用して割り当てられたメモリは、free()を使用して解放されるまでヒープ上に残ります。

alloca()は、現在の関数のスタックフレーム内にメモリを割り当てます。 alloca()を使用して割り当てられたメモリは、現在の関数が返ってきたときにスタックから削除されます。 alloca()は小さな割り当てに制限されています。

alloca()が適切な状況はまれです。ほとんどの場合、malloc()を使用してメモリを割り当てる必要があります。

+2

"alloca()が適切な状況はほとんどありません。ほとんどの場合、malloc()を使ってメモリを割り当てるべきです。"すべての 'alloca()'は可変長配列を提供します。 int n = 6との間には実用的な違いはありません。 double x [n]; 'および' int n = 6;それだけでなく、マルチスレッドプログラムでの 'malloc()'の使用は、パフォーマンス上のボトルネックになる可能性があります。 –

+0

私のクエリは、[[someObject alloc] init] 'を実装したObjective-Cという言葉のほうが多く、メモリを割り当ててオブジェクトをヒープに初期化しました。この '[someObject alloc]'は 'malloc'をバックグラウンドで実装していますか? –

+6

@AndrewHenle私は、alloca()が適切な状況はないと言っていませんでした。私は彼らがまれであると言った。 VLAは有用である場合もありますが、基本的には最適化されています。 OPはCプログラミングのはっきりと新しくなったので、私は細部まで深く関わっていないことにしました。 :) – duskwuff

0

alloc関数は、heapの長さの領域またはブロックのサイズを割り当てるために使用されます。

malloc関数を使用して、heapの記憶域を割り当てます。その名前はメモリ割り当てを表します。

+0

この[URL](http://stackoverflow.com/help)を見ると、品質を向上させることができます –

関連する問題