栈编译器
㈠ 栈区(stack)— 由编译器自动分配释放 ,这句话不懂,求大神指教
一块内存中,划出了一块区域,叫做栈,里面一般存放int,double等等声明的变量,当你这些声明的变量跳出代码作用域之后,编译器就会清空栈里面存放的int,double等等声明的变量
㈡ 栈堆有什么区别,栈是不是编译器设置好的内存, 栈和堆分别怎么用
堆和栈是两种不同的数据结构,它们都可以使不同的数据类型排列在内存中,前者是后进先出,后者是先进后出。构建栈的程序应该是编译器编译时给函数添加的。
㈢ 编译器给栈分配的空间是不是2M啊
默认是1m,不过可以设
㈣ 编译器可以修改栈大小,这个值可以随意设置吗
你说的那个默认1M的栈,应该指的是call stack(函数调用使用的栈)。这个栈用来存放函数调用时所传递的参数(并非所有参数都通过栈传递),栈指针,return address,寄存器的备份,还有每层函数的local variable。
1M大多数情况都是够用的,如果用完可能会发生非法访问等错误。可能会用完1M的情况:某个被调用的函数申请了一个很大的local variable,比如直接在栈上开个大数组之类的;还有就是递归调用,递归层数多了后很容易就用完1M。所以递归一般不要乱用。
㈤ 数据结构中的栈和编译器中的堆栈的栈是一个东西吗
一个是模拟栈,一个是物理内存的堆栈区,不是一个东西!数据结构的栈,主要是一种存储数据的方法,主要是用数组或链表形式存储的
㈥ 程序设计中,堆和栈比较重要。栈存取速度大于堆,而且编译器可以修改栈大小,这个值可以随意设置吗
学习电脑编程多年了,在程序设计方面也算有一番见解,希望这些经验能对题主有所帮助。
现在堆栈通常默认为8M,对吧?事实上,如果你不滥用递归,或者alloca / vla,大多数时候,就足够了。即使它不超过内核限制,通常也不适合驱动大型的,或者它会影响并发进程的数量。并且过程启动时间也应该稍微减少。当然,如果是专用的服务器系统,问题就不严重了。
㈦ 为什么编译器或系统要定义某段内存为堆栈,然后按其特有的”后进先出“方式存取数据
堆栈是方便管理内存,特别是在函数调用这一类的地方使用。系统为堆栈的管理做了相当多的工作。举个例子吧,A函数调用B函数,假如要传递一个参数,你需要在内存中某个地方申请一块地方,存储这个参数,然后B函数通过某种方法知道这个参数的地址在哪,有多大等等,然后B函数又调用C函数,B函数又需要申请一块内存,而且还不能和A函数申请的一样。这些林林种种的工作很繁杂,但CPU和OS结合帮我们解决这些问题,不是很好吗?而堆就是一块可以用户自己控制的内存,当然需要先申请,你不能总是申请数组这种静态内存吧?所有堆提供了动态的特性。