• 内存管理


     1、栈内存

    • 被称为“栈”是因为进程在使用这块内存的时候是严格按照“后进先出”的原则来操作的,而这种后进先出的逻辑,就被称为栈。

    • 随着进程的运行而不断发生变化:一旦有新的函数被调用,就会立即在栈顶分配一帧内存,专门用于存放该函数内定义的局部变量(包括所有的形参),当一个函数执行完毕返回之后,他所占用的那帧内存将被立即释放。

    • 全称为“运行时栈”,栈主要就是用来存储进程执行过程中所产生的局部变量的,当然为了可以实现函数的嵌套调用和返回,栈还必须包含函数切换时当下的代码地址和相关寄存器的值,这个过程被称为“保存现场”,等被调函数执行结束之后,再“恢复现场”。因此,如果进程嵌套调用了很多函数,就会导致栈不断增长,但是栈的大小又是有一个最大限度的,这个限度一般是8MB,超过了这个最大值将会产生所谓的“栈溢出”导致程序崩溃,所以我们在进程中不宜嵌套调用太深的函数,也不要定义太多太大的局部变量。

    2、堆内存

    • 堆内存(以下简称堆〉是一块自由内存,原因是在这个区域定义和释放变量完全由你来决定,即所谓的自由区。堆跟栈的最大区别在于堆是不设大小限制的,最大值取决于系统的物理内存。
    • 堆的全称是“运行时堆(run-time heap)”,跟栈一样,会随着进程的运行而不断地增大或缩小,由于对堆的操作非常重要,

      堆内存操作API的介绍如下:

                  

               

    3、数据段

    数据段实际上分为三个部分:

    • .bss段:专门用来存放未初始化的静态数据,它们都将被初始化为0。
    • .data段:专门存放已经初始化的静态数据,这么初始值从程序文件中拷贝而来。
    • .rodata段:存放只读数据,即常量,比如进程中所有的字符串、字符常量、整型浮点型常量等。

    4、代码段

    代码段实际上也至少分为两部分:.text段和.init段。

    • .text 段用来存放用户程序代码,也就是包括main函数在内的所有用户自定义函数。
    • .init 段则用来存储系统给每一个可执行程序自动添加的“初始化”代码,这部分代码功能包括环境变量的准备、命令行参数的组织和传递等,并且这部分数据被放置在了栈底。

  • 相关阅读:
    C# DataGridView的使用
    C# DataTable使用方法详解
    .NET 异步 Task的一些摘抄记录
    mybatis源码分析之调用过程
    Uipath学习(6):Uipath使用Outlook邮箱
    ABAP学习(33):Selection Screen的Search Help
    Uipath学习(5):Application及Browser,数据获取
    Web Dynpro for ABAP(1):Web Dynpro结构
    Uipath学习(4):Uipath操作excel
    Web Dynpro for ABAP(2):Basic & Dynamic Programmings
  • 原文地址:https://www.cnblogs.com/yuanqiangfei/p/14583844.html
Copyright © 2020-2023  润新知