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
在堆中分配内存来创建对象。
那么,alloc
和 malloc
(和 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:malloc/calloc/realloc/alloca内存分配函数
new 在堆栈而不是堆上(如 alloca 与 malloc)