想起这玩意,是今天在玩cmake的时候触发的,cmake在生成vs项目时,默认会使用/STACK:10000000,将程序堆栈设成10m。
突然想到程序栈,函数栈的问题。
由于操作系统,c语言学习良久,这两个东东到还真未必十分明了。
思索了一下,大致的关系的应该是一个程序一个栈,函数堆栈是在程序进入函数时,动态的在程序栈上分配的,所以,制定函数堆栈大小应该是没有意义的,比如在递归函数中,函数栈可能很大,这时如果按照一般情况下指定了较小的函数栈,那死都不知道怎么死的。当然,编译期间应该也是不知道函数栈大小的。
指定程序栈大小,要说有意义,也就是在内存比较少的情况下,节约点内存吧。可能是这样,虽然每个程序在运行时,操作系统会为其分配4g的内存空间,当然,大部分是不会真正分配的。但是程序堆栈,由于是常用之物,所以,一旦定义了程序堆栈大小,那么操作系统在载入程序时,应该会至少分配该程序设置的程序栈大小,也就是说,如果对一个helloworld程序设置了10m的程序栈,那么即使他根本不需要什么内存,操作系统还是会实际分配至少10m的内存的给他,从而造成浪费。如果情景属实,那可以通过任务管理器来验证。
这个有待验证。
总归,分配10m的程序栈,应该算是比较大的了,cmake不至于会往小的分。