malloc
函数总是在堆上分配内存。但是,在研究Escape Analylis Article on Wikipedia时,我发现作为一种优化,编译器可以将堆分配转换为堆栈分配。例如,如果它看到只使用分配的内存然后在函数内释放。
现在我的问题是,程序员有没有办法自己这样做。那是在堆栈上分配内存?我知道C99允许变量作为数组声明的大小给出,但是说程序员想要调整它的大小。可以吗?
答案 0 :(得分:5)
alloca()
正是您要找的。当然,如果你静态地知道你的结构尺寸,那么最好使用局部变量。
答案 1 :(得分:4)
C99还允许您在函数内的任何位置分配可变长度数组(VLA)和其他变量,而不仅仅是在开始时,所以您关于能够在其他位置分配内存的观点是没有意义的。
您只需插入:
即可int arr[somevar];
在函数的任何地方并对其进行操作。
使用VLA,您不再需要担心在某些实现中使用malloc/free
(或臭名昭着的alloca
,这是进行基于堆栈的分配的另一种方式,a
代表automatic
)代表任意位置的可变大小的分配。
如果你想要调整大小的能力,你仍然必须使用标准的内存分配函数,如malloc
和realloc
。 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