是否可以在堆栈上进行分配

时间:2011-08-16 08:35:47

标签: c optimization compiler-construction

malloc函数总是在堆上分配内存。但是,在研究Escape Analylis Article on Wikipedia时,我发现作为一种优化,编译器可以将堆分配转换为堆栈分配。例如,如果它看到只使用分配的内存然后在函数内释放。

现在我的问题是,程序员有没有办法自己这样做。那是在堆栈上分配内存?我知道C99允许变量作为数组声明的大小给出,但是说程序员想要调整它的大小。可以吗?

3 个答案:

答案 0 :(得分:5)

alloca()正是您要找的。当然,如果你静态地知道你的结构尺寸,那么最好使用局部变量。

答案 1 :(得分:4)

C99还允许您在函数内的任何位置分配可变长度数组(VLA)和其他变量,而不仅仅是在开始时,所以您关于能够在其他位置分配内存的观点是没有意义的。

您只需插入:

即可
int arr[somevar];

在函数的任何地方并对其进行操作。

使用VLA,您不再需要担心在某些实现中使用malloc/free(或臭名昭着的alloca,这是进行基于堆栈的分配的另一种方式,a代表automatic)代表任意位置的可变大小的分配。

如果你想要调整大小的能力,你仍然必须使用标准的内存分配函数,如mallocrealloc。 VGA尚未提供该级别的功能。

答案 2 :(得分:0)

据我所知,将堆分配转换为堆栈分配是一个库事物,而不是编译器可以控制的东西。实际上,在Linux上,malloc使用brk系统调用(调整堆栈大小)而不是使用mmap,除了较大的页面。

引用the source

The old goals we kept are
  1) try to get the long lived large allocations to use mmap()
  2) really large allocations should always use mmap()
  and we're adding now:
  3) transient allocations should use brk() to avoid forcing the kernel
     having to zero memory over and over again