web-dev-qa-db-ja.com

alloc、malloc、およびalloca —違いは何ですか?

Objective-Cのalloc[anyObject alloc]を呼び出すと、実際にC関数mallocとメモリがヒープに割り当てられますが、どこにも見つからないという印象を受けました。これに対する答え。

また、allocを検索しているときに、スタック内のメモリを割り当てるallocaを見つけました。私が間違っていない場合、allocはヒープにメモリを割り当ててオブジェクトを作成します。

では、allocmalloc(およびalloca)の違いは何ですか?誰でも要約できますか?

18

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

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

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

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

31
duskwuff

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

malloc関数は、heapストレージを割り当てるために使用されます。その名前はメモリ割り当てを表します。

本C++ Primerの逐語的な記述は覚えていませんが、機能には大きな違いがあります。たとえば、C++のnewはメモリを割り当てますが、メモリにデータを構築します。 std :: allocatorはメモリを割り当てますが、コンストラクターを呼び出しません。同じことがこれらのC関数にも当てはまります。 1つは割り当てますが、構築はしません。割り当てて構築します。

0