关于“栈”的解析,查了一些资料,都是这么说的:“栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。”
从这句话中,我的理解是:栈就是由编译器本身进行自动分配和释放的。
我一直很疑惑,代码编译生成可执行文件后,安装在其他设备上运行,哪里来的编译器,编译器不是在程序开发的阶段才要用到的吗?生成了可执行文件,不需要编译器了吧,如果没有有编译器,他怎么能够对“栈”进行自动分配和释放呢?
有点头大……
或许是网上的这个描述让人产出误解。
翻了翻这两本书,对堆栈的描述进行了理解:
1.《深入理解计算机系统》1.7.3虚拟内存
2.《Linux_UNIX系统编程手册》6.3进程内存布局
内容挺多,我总结了一下,应该这么解析:代码在编译阶段,编译器只是指定了栈的生成规则,它告诉操作系统,栈应该怎么分配,在哪里分配,分配多大,编译器并不会生成栈,生成“栈”的这个动作,是程序在被安装所在的机器设备上在运行的时候,由系统完成的。
简单一句话:编译器确定生成栈的规则,由操作系统分配和管理。