Xcode将C变长数组放在堆栈上,而不是堆上。
正确吗?如果是,考虑到vla应该让开发人员避免调用malloc,为什么Xcode这样做?
使用堆栈是实现可变长度数组和任何其他具有自动存储持续时间的对象的自然方法,因为:
- 堆栈是为后进先出的内存使用而设计的:函数(或嵌套块)的数据在函数启动时被推入堆栈,当函数执行结束时从堆栈中删除。
- 易于分配和释放。每个都可以通过调整堆栈指针来实现,并且可以通过可变长度数组所需的大小轻松调整。
使用与malloc
相同的池分配来实现它们将是一个问题,因为函数并不总是通过返回而终止。C具有setjmp
和longjmp
特性,允许直接跳转到调用堆栈中的较早点。longjmp
可以通过将堆栈指针和程序计数器设置为执行setjmp
时的值来实现,并且这些值存储在setjmp
上下文对象中。如果从malloc
池中分配了可变长度数组,则有必要遍历堆栈上调用树的所有级别,找到在每个级别中分配的可变长度数组,并释放它们。这就意味着,在分配内存时,必须在堆栈树中创建这些内存分配的记录。