`
lg_asus
  • 浏览: 190732 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

栈空间分配

阅读更多
内存分堆和栈,堆是动态分配的,new,malloc等都是在堆上分配内存,需要手工回收或平台回收。栈用于分配局部变量、方法参数、返回地址,方法运行结束后自动回收。
对于静态类型语言,在编译期就能知道这个方法有哪些局部变量、参数,占用的内存大小也是确定的,因此可以直接在栈上分配,这种叫做栈的静态分配。对于python,javascript这种动态数据类型(python和javascript是一切皆对象语言),在程序运行之前是不能知道局部变量、参数占用多少字节的,因此局部变量和参数可能都是在堆上分配的(这个不确定,猜测)。

对于栈的静态分配,如下面代码(java):
void foo(){
 int a=0;
 int b=1;
 print(a);
}


在压栈的时候,a比b先,因此b是栈顶,这个时候如果按数据结构中的想读取a只能通过弹栈是不行的,这个时候知道栈顶指针和偏移量,可以算出a的地址,通过地址就能直接读取a了,并不是说要弹栈,参考:http://blog.csdn.net/chenlycly/article/details/37912683
另外Q群大牛推荐看一本书:CSAPP(Computer System: A Programmer Perspective)。
分享到:
评论

相关推荐

    深入Java内存分配

    - **方法的引用参数**:在栈空间分配地址,并指向堆空间中的对象实例,方法调用结束后从栈空间回收。 - **局部变量**:使用`new`创建时,会在栈空间和堆空间中分别分配地址和对象实例,局部变量生命周期结束后,栈...

    Java中堆内存与栈内存分配浅析

    栈内存具有固定大小,因此在编译时即可确定其空间需求。栈内存的特点是先进后出(Last In First Out, LIFO),这意味着最后压入栈中的数据会被最先弹出。 - **特点**: - 固定分配:变量的大小在编译时就已确定。 ...

    内存中堆和栈的分配区别

    在计算机科学领域,内存管理是实现程序高效运行的关键技术之一,而其中的堆(Heap)与栈(Stack)是两种核心的内存分配方式。本文将深入探讨这两种内存区域的分配区别,以及它们在程序中的作用机制,帮助读者理解C/...

    堆和栈内存分配(详细)

    - **栈**:若栈内有足够空间则立即分配,否则报错。 - **堆**:系统查找合适大小的空闲内存块,分配给程序,剩余部分重新归入空闲链表。 3. **申请大小的限制**: - **栈**:空间固定且相对较小,容易溢出。 - ...

    栈溢出基础知识、栈溢出保护机制、栈溢出利用方法.docx

    栈溢出是计算机安全领域中的一个重要概念,主要发生在程序运行过程中,由于栈空间分配不当,导致数据超出预定的栈帧范围,从而影响到其他栈帧中的数据,甚至可能破坏程序执行流程,造成安全风险。本篇文章将深入探讨...

    数据结构两栈共享空间C++顺序栈

    传统的栈实现通常为每个栈分配独立的空间,但当内存资源有限时,这种做法可能不切实际。两栈共享空间的解决方案是设计一个数据结构,使得两个栈可以在同一块内存区域交替使用,当一个栈为空时,另一个栈可以占用全部...

    C,C++内存分配的详细讲解包括堆,栈,数据段等

    2. **堆区**:用于动态分配的内存空间,由程序员负责分配和释放。常见的堆内存分配函数有`malloc()`、`calloc()`和`realloc()`。若程序员忘记释放内存,则可能会导致内存泄漏,直到程序结束时由操作系统回收。 3. *...

    两个堆栈共用存储空间

    这样可以更好地控制空间分配,同时降低上溢的风险。 6. **栈的压缩与扩展**:当一个栈使用完毕后,可以将其元素移到存储空间的另一端,然后释放中间的空闲空间。这可以有效地回收空间,但需要额外的时间和计算资源...

    JVM内存空间分配笔记

    ### JVM内存空间分配详解 #### 一、JVM内存模型概览 JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分...

    Java中堆与栈的内存分配.pdf

    在程序设计中,所有的方法调用都是通过栈进行的,所有的局部变量、形式参数都是从栈中分配内存空间的。退 出函数的时候,修改栈指针就可以把栈中的内容销毁。 6. 内存管理的重要性 内存管理是Java程序设计中的一个...

    C语言中的递归函数及其注意

    这种情况下,编译器可能能够优化掉不必要的栈空间分配,降低空间复杂度。 总之,C语言中的递归函数提供了一种优雅的解决问题的方法,但同时也需要注意递归深度、效率和栈溢出等问题。在实际编程中,要结合问题的...

    实验二 进程与线程1

    在新进程的内核栈空间分配成功后,会预留一部分空间来存储陷阱帧(Trap Frame),这是一个结构体,保存了异常或中断发生时CPU寄存器的状态,以便在异常处理结束后恢复程序执行。陷阱帧的指针会被设置在内核栈的顶部...

    堆和栈内存分配实用.pdf

    栈空间大小有限,过多的递归调用或者大的局部变量都可能导致栈溢出。 接下来,堆(Heap)是一种可动态分配的内存区域,与栈的自动分配和回收不同,堆上的内存分配是显式进行的,需要程序员通过代码来控制。在C语言...

    堆和栈的内存分配浅谈

    - 堆:操作系统会遍历空闲内存链表,找到合适大小的空间分配给程序,并记录分配信息。 在内存大小限制方面,栈的大小通常是固定的,而堆的大小受限于虚拟内存,因此堆可以提供更大的空间。 在效率方面,栈的分配和...

    测试服务器的最大并发的连接数.doc

    实际上,问题出在`cSendData`变量的栈空间分配不足(只有20字节),超过了它的范围,这才是栈溢出的原因,而非线程生成过多。 为了进一步挑战服务器的极限,计划对程序进行调整,减小线程栈空间,增加线程数量,并...

    mini2440启动代码分析

    4. 栈空间分配:每个处理器模式都有其独立的栈空间,这些栈的起始地址在内存布局中预先定义,以确保在不同模式下切换时的栈操作正确无误。 5. ARM处理器状态检查:这段代码检查编译器是否以16位或32位模式编译,...

    STM32_keil_mdk启动代码发分析

    - **栈空间分配**: - `AREA STACK, NOINIT, READWRITE, ALIGN=3`:定义了一个名为`STACK`的数据段,其中`NOINIT`表示这段内存不会被初始化,`READWRITE`表示这段内存可读可写,`ALIGN=3`表示这段内存按照8字节对齐...

Global site tag (gtag.js) - Google Analytics