栈
首先需要详细了解计算机系统中Stack machine的概念,了解程序中的调用过程。每次在调用函数的时候。会按照从左到右的顺序依次将程序压到栈中。并在栈中返回当前地址与调用堆栈。然后跳转到调用内部。pc跳转函数在内部执行该函数的指令。
栈溢出:一般情况下操作系统会规定固定栈空间的大小。
当然,这个是实际情况。我们可以根据自己的需要来分配栈空间。在实际编写程序的时候。如果出现两个程序互互相调用或者没有退出指令的话。这时栈的空间就会无限延长。
栈一般分为用户栈和内核栈。在栈顶会存在一个特殊的内存页guard。当栈一旦越界访问该特殊的guard页的时候。就会出现栈溢出的错误。
堆
当程序运行的时候。需要申请额外的运行空间来存放相应的变量和数据。这会就需要用到堆。堆的内存空间一般由该变量在栈中使用的内存来决定.堆的内存一般是由操作系统或者专门的内存程序来管理的。在C++中一般使用malloc或者new从内存中来申请内存。使用free或者delete来释放空间。空间释放之后会由操作系统来进行回收。当然在实际的程序动态运行过程中这个操作非常的复杂。
面试题
你和我说下堆和栈的区别吧?
用户在代码中定义的变量,保存在栈中。用户申请地址给这些变量用时,这些地址存放在堆中。当然,指针的大小在C++中是由CPU决定的,你是32位CPU那么指针的大小就是4位。你是64位CPU那么指针的大小就是8位。
同时栈的创建和销毁过程是由编译器决定的。保存在堆上的变量创建和销毁由用户自己决定。比如说new和delete。