CSAPP B站陪跑视频学习笔记

news2024/11/16 17:48:20

视频地址

How program run- overview

栈(stack)

  • 栈的作用:

    局部变量和参数:当函数被调用时,函数的局部变量和参数会被分配到栈上。这是因为这些变量的生命周期通常只限于函数执行期间。
    函数调用链:栈用于管理函数调用链,包括保存函数调用的返回地址、当前函数的状态和局部变量等。
    自动内存管理:栈是一种LIFO(后进先出)的数据结构,函数调用结束后,栈上的内存会自动释放,无需显式管理。

  • 运行时内存分配:

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

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

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),当程序员忘记释放不再使用的内存时,以及内存碎片化问题。

内存布局全貌

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1992060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Thinkphp5x远程执行命令及getshell

一.环境配置 靶场:vulhub/thinkphp/5-rce docker-compose up -d #启动环境 访问靶场: 漏洞利用: 漏洞根本源于 thinkphp/library/think/Request.php 中method⽅法可以进⾏变量覆盖,通 过覆盖类的核⼼属性filter导致rce&#xf…

手把手教你OpenCV实现Canny边缘检测 C++

1,原理 canny边缘检测算子是传统边缘检测算子中最优秀的,canny检测基于下面三个目标: (1)低错误率。即所有边缘都应该找到,并且没有虚假边缘。 (2)准确的定位边缘。即检测到的边缘应该接近真…

几款设计师必备的AI抠图软件工具分享给你!

前言 在图像处理领域,抠图是一项基本而关键的技能。传统上,PS是作为抠图的首选工具,但其操作复杂性往往令初学者望而却步。幸运的是,随着AIGC技术的发展,现在有多款AI软件和在线网站能够以更简单、快捷的方式完成抠图…

怎么把图片压缩更小?快捷缩小图片的3个在线工具

现在每天都会需要接触很多的图片,当图片在本地存储到一定数量时会占用大量的内存,并且不利于在网上传输使用,那么有什么方法能够快速压缩图片太大呢?在线改图片大小是一种比较简单的缩小图片的处理方法,在网上也有很多…

【多线程-从零开始-柒】代码案例1—单例模式

单例模式:是一种设计模式 设计模式,类似于“棋谱”,就是固定套路,针对一些特定的场景,给出一些比较好的解决方法只要按照设计模式来写代码,就可以保证代码不会太差,保证代码的下限 设计模式 设…

【性能优化】DNS解析优化

前言 DNS解析过程消耗时间DNS有本地缓存 比如首次访问某站点,会耗费很多时间进行DNS解析,但解析结束后会将ip地址存入本地设备,后续再访问此域名时就会直接从缓存中取。 首次访问页面时,本页面的DNS解析是无法优化的&#xff0…

antv l7简化版demo(含mapbox样例)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><link rel"stylesheet" href"https://gw.alipayobjects.com/os/rmsportal/PqLCOJpqoOUfuPRacUzE.css" /><title>滑过默认高亮</…

Linux磁盘管理与文件结构(二):实用工具和命令、fdisk分区示例

文章目录 4、查看或管理磁盘分区-fdisk格式选项示例 4、示例&#xff1a;使用 fdisk 命令创建分区需求操作步骤 5、创建文件系统-mkfs格式常用选项示例创建其他类型的文件系统 6、创建文件系统-mkswap格式常用选项示例拓展&#xff1a;关闭和启用交换分区拓展&#xff1a;swap分…

路径规划 | 五种经典算法优化机器人路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 五种经典算法优化机器人路径规划&#xff0c;算法可任意更换&#xff01;地图可修改&#xff01;Matlab语言 1.分为简单路径规划和复杂路径规划两种情景&#xff0c;采用粒子群算法(PSO)&#xff0c;遗传算法(GA)&am…

[Qt][信号与槽][上]详细讲解

目录 0.Q_OBJECT宏1.信号和槽概述1.信号2.槽3.说明 2.信号和槽的使用1.连接信号和槽2.查看内置信号和槽 0.Q_OBJECT宏 Qt如果要让某个类能够使用信号槽&#xff0c;则必须要在类最开始的地方&#xff0c;写下Q_OBJECT宏 1.信号和槽概述 1.信号 在Qt中&#xff0c;⽤⼾和控件…

如何在银河麒麟操作系统上搭建 Electron (含 Electron 打包指南)

本次教程所用版本 QT版本&#xff1a;5.12 Eletron版本&#xff1a;31.3.1 Electron-packager版本&#xff1a;17.1.2 VScode版本&#xff1a;1.92.0 Node版本&#xff1a;18.19.0 npm版本&#xff1a;10.2.3 前言&#xff1a; 随着跨平台应用开发的需求日益增长&#…

Python基础核心知识点(建议收藏再用)

目录 一、python入门day1-day24 day01-03 编程语言day04 变量day05 垃圾回收机制&#xff08;GC机制&#xff09; 1 引用计数2 标记清除3 分代回收 day05 程序交互与基本运算符day06 可变不可变类型day07 流程控制 1 赋值 2 浅拷贝 copy3 深拷贝 deepcopy day08-10 基本数据类…

ES数据类型学习之keyword和text以及查询条件match和term

es&#xff08;4&#xff09;—查询条件match和term_es match term-CSDN博客 参考文章如上。开始学习 1.text和keyword的学习 直接上官网Text type family | Elasticsearch Guide [7.17] | Elastic Text type family The text family includes the following field types: …

默克索引轻松搞定,快速查找!

在化学、药学和生物科学领域&#xff0c;有一部被广泛认可的权威工具书——《默克索引》&#xff08;Merck Index&#xff09;。自1889年首次出版以来有130多年的历史&#xff0c;《默克索引》一直被视为化学品、药物和生物制品的关键物理、药理和历史信息的最权威、最可靠的来…

Ubuntu22.04安装NVIDIA Driver和CUDA

Ubuntu22.04安装NVIDIA Driver和CUDA 1.安装NVIDIA Driver(1).卸载Ubuntu自带的驱动程序&#xff1a;(2).禁用nouveau:(3).安装相应的NVIDIA Driver: 2.安装CUDA(1).下载并安装CUDA:(2).配置环境变量&#xff1a; 本文记录了在 "Ubuntu22.04"上安装 "NVIDIA D…

百度关掉Ai智能回答(保姆级技术文,解决过程完整记录)

随着AI时代到来&#xff0c;百度也是不肯落于人后&#xff0c;在其搜索页面推出了AI自动回答。点到这里的你想必正因此懊恼&#xff0c;你说它怎么切入不好&#xff0c;非得搞个东西在那一直跳&#xff0c;顶着下面的内容哐哐直跳&#xff0c;你想好好浏览内容还得等它跳消停了…

C++(week15): C++提高:(四)并发服务器架构模型

文章目录 一、五种网络IO模型1.数据传输过程2.两组重要概念3.五种网络IO模型(1)阻塞式IO(2)非阻塞式IO(3)IO多路复用(4)信号驱动IO(5)异步IO 4.五种网络IO模型的对比5.举例说明 二、并发服务器模型1.循环式迭代式模式2.并发式服务器3.prefork服务器4.反应式服务器 (Reactor)5.反…

协同过滤推荐算法(包括传统协同过滤、矩阵分解、NeuralCF)

一、什么是协同过滤推荐算法 传统的协同过滤&#xff08;Collaborative Filtering, CF&#xff09;是一种推荐系统技术&#xff0c;它基于用户的历史行为数据来预测用户对未评分项目的潜在兴趣。 “协同大家的反馈、评价和意见一起对海量的信息进行过滤&#xff0c;从中筛选出…

IPD如何通过数字化项目管理平台落地实施?

随着市场竞争的日益激烈&#xff0c;企业对于产品研发的效率和质量逐渐提高&#xff0c;越来越多的企业关注到IPD(Integrated Product Development)&#xff0c;希望参考IPD体系的方法理念和实践经验&#xff0c;从而帮助企业快速响应市场变化、缩短产品开发周期、提升产品开发…

step9:设置软件初始状态获取时不发送配置指令

文章目录 文章介绍问题描述效果图 解决办法下拉框控件ComboBox切换开关组件Switch数值微调框控件SpinBox 文章介绍 问题描述 虚拟端口&#xff08;硬件&#xff09;发送信号给客户端电脑&#xff0c;会设置此时硬件的各种基础参数&#xff0c; 客户端软件被设置基础参数之后&a…