与malloc / free相比,使用C99 VLA是个好主意吗?

时间:2010-06-21 04:30:20

标签: c c99

使用C99 VLA是个好主意吗?与malloc / free相比,何时使用VLA是否合适? (因为VLA可能会爆炸堆叠?)

6 个答案:

答案 0 :(得分:25)

是的,除非你知道你的筹码可能爆炸。如果需要,您也可以更改堆栈的大小,这与每个操作系统的方式不同,但它是可能的。 VLA的优点是:

  • 快速:无论如何都要调整堆栈指针和/或帧指针,因此VLA的成本几乎为0.

  • 简单:一个简单的定义,没有指向初始化的指针,检查是免费的,也没有内存泄漏的风险。

  • 它自动是线程安全的,因为每个线程都有自己的堆栈。它还具有更好的缩放比例,因为不需要锁定,使用malloc/free时可能会出现一个问题。

  • 可读:这是一个非常简单的概念,因此不太可能引入微妙的错误。

它有一些缺点:

  • 尺寸有限:正如已经说过的,堆叠会爆炸。

  • 缓冲区溢出比堆内存更严重(人们可以说这是一个优势,因为崩溃的应用程序优于静默破坏数据并最终崩溃不相关的指令)。

  • 可移植性:并非所有编译器都实现它,但它通常可以由alloca模拟(注意语义有点不同但没有什么真正严重)。

答案 1 :(得分:3)

堆栈分配的主要优点是您可以获得已分配的可变长度数组的自动内存管理。由于内存管理是任何C程序的核心挑战之一,如果可以,您绝对应该使用VLA来简化任务。

我会主张你应该尽可能地使用VLA,否则只在以下情况下使用malloc:你需要控制存储的持续时间,如果你有非常大的分配,并且你想要处理 - 内存错误优雅。

答案 2 :(得分:2)

C ++不支持VLA。因此,如果需要,将代码移植到C ++将会花费更多的精力。

然后,有些人认为这实际上是一件好事,狡猾地提出“阶级”作为c中符号的美妙名称: - )

答案 3 :(得分:0)

有关C99相关链接的良好列表(包括有关可变长度数组的信息的链接),请参阅:

Xcode现在默认使用C99 - 那么什么是C99?

http://lists.apple.com/archives/xcode-users/2008/May/msg00665.html

答案 4 :(得分:0)

只需添加另一个方面(不是直接的答案,因为不涉及malloc / free,但仍然相关):

//
// File: someheader.h
//
// Description: Some header intended to be usable in C  a n d  C++.
//              (skipping include guards only for brevity!)
//

#ifdef __cplusplus
extern "C"
{
#endif

void f(size_t n, int(*)[n]); // OOPS: not supported by C++...

#ifdef __cplusplus
}
#endif

因此,这不仅是由于porting造成的,而且是更普遍的兼容性问题...

如果需要这种兼容性,则需要跳过VLA。

答案 5 :(得分:0)

如果您的项目只打算使用符合C99的编译器进行编译,而替代方法是使用alloca(),则使用C99 VLA是一个好主意。不应该在通常使用malloc()的地方使用VLA,并且如果您不知道alloca()的功能以及可能遇到的问题,则不应该使用VLA。