alloc,malloc和alloca - 有什么区别?

Ani*_*pta 19 c memory malloc memory-management alloca

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

此外,在搜索时alloc,我发现了alloca哪些在堆栈中分配内存.如果我没有错,请alloc在堆中分配内存以创建对象.

那么allocmalloc(和alloca)之间有什么区别?任何人都可以总结一下吗?

dus*_*uff 31

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

malloc()在进程堆上分配内存.使用malloc()时分配的内存将保留在堆上,直到使用它为止free().

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

情况下alloca()是合适的并不多见.在几乎所有情况下,您都应该使用malloc()分配内存.

  • @AndrewHenle我没有说有没有*的情况`alloca()`是合适的; 我说他们很少见.VLA是一种有用的情况,但即便如此,它们本质上也是一种优化.由于OP对于C编程来说显然是新手,我选择不深入细节.:) (10认同)
  • "alloca()适当的情况很少见.在几乎所有情况下,都应该使用malloc()来分配内存." 不.所有`alloca()`都提供可变长度数组.`int n = 6;之间没有实际区别; double x [n];`和`int n = 6; double*x = alloca(n*sizeof(*x));`不仅如此,在多线程程序中使用`malloc()`可能是一个严重的性能瓶颈. (6认同)
  • 没有提到 `alloca()` 显然是 BSD\GNU 并且不符合 C 或 POSIX 标准 (3认同)
  • @AnindyaSengupta你的问题没有提到Objective-C,所以我不认为这是一种可能性.是的,`+ [NSObject alloc]`方法最有可能调用`malloc()`,或者功能相同的东西. (2认同)
  • @Andrew Henle,如果你在循环中使用,那么`alloca`和VLA之间存在真正的**实际区别. (2认同)
  • @étale-cohomology 我不愿称其为“垃圾收集”。帧本地,当然。但没有什么比这更美妙的了。 (2认同)