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

Nya*_*yan 19 c c99

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

Pat*_*ter 26

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

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

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

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

  • 可读:它确实是一个简单的概念,因此不太可能引入细微的错误.

它有一些缺点:

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

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

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