alloc、malloc 和 alloca — 有啥区别?

Posted

技术标签:

【中文标题】alloc、malloc 和 alloca — 有啥区别?【英文标题】:alloc, malloc, and alloca — What's the difference?alloc、malloc 和 alloca — 有什么区别? 【发布时间】:2015-12-17 14:24:08 【问题描述】:

我的印象是Objective-C中的alloc(当我们调用[anyObject alloc]实际上是在实现C函数malloc并且内存在堆中分配,但在任何地方都找不到答案。

另外,在搜索alloc 时,我发现alloca 在堆栈中分配内存。如果我没记错的话,alloc 在堆中分配内存来创建对象。

那么,allocmalloc(和 alloca)有什么区别?谁能总结一下?

【问题讨论】:

【参考方案1】:

alloc() 不是标准 C 库函数。一些较旧的编译器和库包含一个<alloc.h> 库,它提供了一些内存分配功能,但这不是标准的。 Microsoft Visual C++ 运行时包含一个Alloc() 函数,它有点类似于malloc(),但这也不是C 标准的一部分。

malloc() 在进程堆上分配内存。使用malloc() 分配的内存将保留在堆上,直到使用free() 释放。

alloca() 在当前函数的栈帧中分配内存。当当前函数返回时,使用alloca() 分配的内存将从堆栈中删除。 alloca() 仅限于小额分配。

alloca() 适合的情况很少见。在几乎所有情况下,您都应该使用malloc() 来分配内存。

【讨论】:

"适合 alloca() 的情况很少见。几乎在所有情况下,您都应该使用 malloc() 来分配内存。"不,alloca() 所做的只是提供可变长度数组。 int n = 6; double x[n];int n = 6; double *x = alloca( n * sizeof( *x ) ); 之间没有实际区别,不仅如此,在多线程程序中使用 malloc() 可能会成为严重的性能瓶颈。 @AndrewHenle 我没有说alloca() 适合的情况是no;我说他们很少见。 VLA 是它们有用的一种情况,但即使在那里,它们本质上也是一种优化。由于 OP 显然是 C 编程的新手,因此我选择不深入细节。 :) @AnindyaSengupta 你的问题没有提到Objective-C,所以我不认为这是一种可能性。是的,+[NSObject alloc] 方法很可能会调用 malloc(),或者功能上等效的东西。 @Andrew Henle,如果您在循环中使用,alloca 和 VLA 之间存在真正的实际区别。 没有提到 alloca() 显然是 BSD\GNU 并且不是 C 或 POSIX 的标准【参考方案2】:

alloc 函数用于分配长度为heap 的大小字节的区域或块。

malloc 函数用于分配heap 存储。它的名字代表内存分配。

【讨论】:

请看这个URL它会很方便提高你的质量【参考方案3】:

我不记得 C++ Primer 一书中的逐字语句了,但是函数之间有一个主要区别。例如 C++ 中的 new 分配内存,但它也将数据构造到内存中。 std::allocator 分配内存,但不调用任何构造函数。这些 C 函数也是如此。一个分配但不构造。一个分配和构建。

【讨论】:

以上是关于alloc、malloc 和 alloca — 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

C中的alloca函数

C:malloc/calloc/realloc/alloca内存分配函数

new 在堆栈而不是堆上(如 alloca 与 malloc)

malloccallocrealloc和alloca各种的区别

malloc 和 allocate 有啥区别

c_cpp alloc 2d array,memset和malloc