CSAPP B站陪跑视频学习笔记

视频地址

How program run- overview

栈(stack)

  • 栈的作用:

    局部变量和参数:当函数被调用时,函数的局部变量和参数会被分配到栈上。这是因为这些变量的生命周期通常只限于函数执行期间。

    函数调用链:栈用于管理函数调用链,包括保存函数调用的返回地址、当前函数的状态和局部变量等。

    自动内存管理:栈是一种LIFO(后进先出)的数据结构,函数调用结束后,栈上的内存会自动释放,无需显式管理。

  • 运行时内存分配:

    动态变化的内存需求:在程序运行时,某些数据的大小和数量可能无法提前确定。栈允许在函数调用时动态分配这些数据的内存。

  • 栈帧(Stack Frame):每次函数调用都会在栈上创建一个新的栈帧,用于存储该函数的局部变量、参数和返回地址。函数返回时,该栈帧会被自动弹出,释放相应的内存。

    示例:

c 复制代码
void foo(int a) {
    int b = a + 10;  // b 是局部变量,分配在栈上
    // ...
}  // 函数结束,b 的内存被释放

int main() {
    int x = 5;
    foo(x);  // 调用 foo 函数时,创建一个新的栈帧
    // ...
    return 0;
}

在这个示例中,foo 函数调用时,会在栈上分配内存用于存储局部变量 b 和参数 a。当 foo 函数返回时,这些内存会自动释放。

  • 对于一个c语言程序,编译器在转为汇编的过程中就进行了管理创建栈的操作

堆(heap)

  • 如果想要跨函数进行变量的操作?

堆(Heap)允许跨函数的变量操作,这是因为在堆上分配的内存具有持久性,不依赖于函数调用的生命周期。堆上的内存可以在不同函数之间共享和传递,这使得它非常适合存储需要跨函数或线程共享的数据结构。

跨函数变量操作的原理:

  1. 动态内存分配:

    通过动态内存分配函数(如malloc、calloc、realloc在C中,new在C++中)在堆上分配内存。

    分配的内存返回一个指针,指向堆中的内存地址。

  2. 指针传递:

    将指向堆内存的指针在函数之间传递,允许不同函数访问和操作相同的内存。

  3. 内存释放:

    使用内存释放函数(如free在C中,delete在C++中)在合适的时机释放堆上的内存,避免内存泄漏。

  1. 定义

    • 堆是一种动态内存分配区域,用于在运行时分配和释放内存。它主要用于存储对象和数据结构,其生命周期不确定,可以跨越函数调用和进程的整个生命周期。
  2. 特点

    • 动态分配 :内存可以在运行时通过函数(如C语言中的mallocfree,C++中的newdelete,Java中的new)进行分配和释放。
    • 管理复杂:由于堆中的内存是动态分配的,程序员需要显式管理内存的分配和释放,容易出现内存泄漏和碎片化问题。
    • 存储数据:适用于大小不确定且需要在多个函数或线程之间共享的数据,如链表、树、图等复杂数据结构。
  3. 使用场景

    • 需要动态大小的数据结构(如动态数组、链表)。
    • 数据需要跨多个函数或线程共享。
    • 对象的生命周期超出了函数调用的范围。

堆与栈的关系

  1. 内存分配

    • :由系统自动管理,函数调用时分配内存,函数返回时自动释放,适用于生命周期短且占用内存较小的数据。
    • :由程序员手动管理,需要显式分配和释放内存,适用于生命周期长且占用内存较大的数据。
  2. 效率

    • :操作简单且高效,因为其分配和释放内存是由系统自动管理的,速度非常快。
    • :操作复杂且相对较慢,因为需要手动管理内存,并且可能会导致内存碎片化问题。
  3. 生命周期

    • :变量的生命周期与其所在函数的调用周期一致,函数返回后,栈上的内存会被释放。
    • :变量的生命周期由程序员控制,可以跨越多个函数调用甚至整个程序的生命周期,直到显式释放内存。
  4. 典型问题

    • :可能会出现栈溢出(Stack Overflow),当递归调用过深或局部变量过多时。
    • :可能会出现内存泄漏(Memory Leak),当程序员忘记释放不再使用的内存时,以及内存碎片化问题。

内存布局全貌

相关推荐
Nu11PointerException1 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
亦枫Leonlew3 小时前
三维测量与建模笔记 - 3.3 张正友标定法
笔记·相机标定·三维重建·张正友标定法
考试宝3 小时前
国家宠物美容师职业技能等级评价(高级)理论考试题
经验分享·笔记·职场和发展·学习方法·业界资讯·宠物
黑叶白树4 小时前
简单的签到程序 python笔记
笔记·python
@小博的博客5 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
幸运超级加倍~5 小时前
软件设计师-上午题-15 计算机网络(5分)
笔记·计算机网络
南宫生5 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步6 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
love_and_hope6 小时前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen6 小时前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习