CSAPP学习记录-Course Overview

2023-11-18

这是我开始学习CSAPP的笔记的第一遍,在接下来的内容,我会分享自己在学习CSAPP时的笔记,感受等等,学习资料来自b站

声明:所有内容基于自己的理解,如有错误感谢大家指出。

链接:https://www.bilibili.com/video/BV1iW411d7hd?spm_id_from=333.851.header_right.fav_list.click

这节课主要就讲了讲整门课程会讲的几个主题,并举了一些小例子,我记录了一下

一.数据类型界限

#include <stdio.h>

int main() {
    int a1 = 300 * 400*500;
	int b1 = 400 * 500*300;
	printf(a1);
	printf(b1);

	int a2 = 40000 * 40000;
	int b2 = 50000 * 50000;
	printf(a2);
	printf(b2);

    
}

执行上述代码,输出如下。

1600000000
-1794967296
-647710720
-647710720
3.140000
0.000000

你会发现对于int类型的输入,如果超出了范围,会有一个值去表示,但这个值很明显不是正确的计算结果,但庆幸的是,基本的结合律等运算规律还是满足。但对于浮点类型的数,他就不满足交换律了,这是因为浮点数在表示时会舍弃掉那些看起来影响不大的数据,导致出现了-1e20+3.14=-1e20的现象。 

二.内存引用 

楼主主要用java,c学过但网的差不多了,看到这里c居然没有对数组的界限做一个判断还是挺吃惊的。不得不说java还是挺不错的,直接告诉你数组越界,如果是c出现这样的情况,当你发现你写的程序没有报错,反而出现一串奇怪的数字肯定是及其懵逼的。。。。。

进入主题,产生上述现象原因牵扯到一个内存分配的问题(见下图),对于fun函数c会给他分配一块连续的内存(这是问题产生的关键),正是因为分配了一块连续的内存,才会导致你访问超出数组下标的内存不会出错,因为这块是有东西的(即图中的23456区域),fun(2),fun(3)都会去修改d的内存的数据,所以导致d的返回值异常。45没有影响是因为没有修改d,而6报错是因为你修改了程序运行必备的东西,比如用来记录已经分配了的内存的区域。(可不可能是页表?)

三.代码层面的优化

可以看到,几乎相同的程序,运行的速度相差了接近二十倍,这只是在个人电脑上的差异,在某些特定的电脑,差距可能更大。(庆幸自己写代码的习惯是一行行去访问)

为什么会产生如此大的差异呢,可以看下面这张图

可以看到,copyij访问内存的吞吐量比copyji大得多(吞吐量是左边竖着的那列,单位是MB/s)。个人猜测的话copyij访问内存的方式是*(src + i * 2048+j),每次移动都是一个单位一个单位移动,而copyji每次访问则是2048个单位去移动,然后根据空间局部性原理,某个数据被访问那么它附近的数据也会马上被访问,src的调入内存的页应该是连着放的,所以copyji会频繁涉及到页面置换,消耗大量时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSAPP学习记录-Course Overview 的相关文章

  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Java将数字金额转换为中文大写

    import java math BigDecimal import java util regex Matcher import java util regex Pattern 2022 5 5 author lf public clas

随机推荐

  • vue对于时间的处理

    2023 08 05 11 25 45 假如这个就是我们要传的时间字符串 比如今天是2023 08 05 同一天 现在把这个时间字符串传入到 formatDate 这个方法 就会给你返回 11 25 比如今天是2023 08 06 前一天
  • 一文综述人脸检测算法(附资源)

    文章来源 SIGAI 本文共9400字 建议阅读10 分钟 本文将和大家一起回顾人脸检测算法的整个发展历史 导读 人脸检测是目前所有目标检测子方向中被研究的最充分的问题之一 它在安防监控 人证比对 人机交互 社交和娱乐等方面有很强的应用价值
  • mysql准确查询出以固定字符开头的数据

    在做开发过程中 我们经常会遇到多种支付方式 为了区分 我们可能会根据订单的前两位或者前几位固定值来区分 在这里我向大家推荐三种方法 使用LEFT函数 函数使用方法如下 str是原串字段 length是要提取的长度 这里只能是正整数 该字段是
  • 检测zookeeper和kafka是否正常

    cd dirname 0 source bash profile count zoo ps ef grep config zookeeper properties grep v grep wc l count kafka ps ef gre
  • 常见的八种导致 APP 内存泄漏的问题

    像 Java 这样具有垃圾回收功能的语言的好处之一 就是程序员无需手动管理内存分配 这减少了段错误 segmentation fault 导致的闪退 也减少了内存泄漏导致的堆空间膨胀 让编写的代码更加安全 然而 Java 中依然有可能发生内
  • VUE3快速上手

    目录 1 Vue3简介 2 Vue3带来了什么 1 性能的提升 2 源码的升级 3 拥抱TypeScript 4 新的特性 一 创建Vue3 0工程 1 使用 vue cli 创建 2 使用 vite 创建 项目结构介绍 二 常用 Comp
  • 软件测试行业所需要的技能

    近来 软件测试行业发展迅速 企业越来越重视测试了 越来越多的人加入了测试大军中 很多人也想通过自学来学习软件测试技术加入这个行业 让我们来看一下究竟如何才能学好软件测试吧 一 软件测试基础知识 要想进入测试这个行业 就必须要了解什么是软件测
  • IDEA常用配置之类Tab页多行显示

    文章目录 IDEA常用配置之类Tab页多行显示 IDEA常用配置之类Tab页多行显示 默认在Idea中打开类过多 后面会隐藏显示 这里修改配置 将类设置为多行显示 方便查找已经打开的类 修改后显示样式
  • Redis主从部署及sentinel配置详细教程

    Redis主从部署及sentinel配置详细教程 一 环境介绍 1 三个redis节点的IP规划 2 节点的系统版本 二 安装redis 1 下载Redis源码包 2 解压软件包 3 安装gcc相关模块 4 编译软件目录deps 下内容 5
  • 【亲测】Parallels Desktop 16 / 17在MacOs Big Sur / Monterey下网络初始化失败:您的虚拟机将继续正常运作 解决办法

    场景 Mac升级Big Sur Monterey后 然后再升级Parallels Desktop到16 17版本后 Parallels Desktop开启windows或者其他虚拟机就出现 网络初始化失败 您的虚拟机将继续正常运作 解决办法
  • 使用存储过程返回结果集

    因业务复杂 SQL较为庞大 后改造为存储过程方式 传参 获取结果集 此处只显示存储过程的结构部分 也是最重要部分 CREATE OR REPLACE PACKAGE PKG QUALITYCONTROL IS TYPE retcursor
  • vite + vue3 + setup + pinia + ts 项目实战

    介绍 一个使用 vite vue3 pinia ant design vue typescript 完整技术路线开发的项目 秒级开发更新启动 新的vue3 composition api 结合 setup纵享丝滑般的开发体验 全新的 pin
  • Ubuntu下安装和注册beyond compare 4

    下载 安装 下载安装包网址 Ubuntu上选择Debian安装包 https www scootersoftware com download php sudo dpkg i bcompare 4 4 6 27483 amd64 deb 注
  • 【汽车电子】浅谈车载系统QNX

    目录 1 概述 2 QNX系统介绍 2 1 系统特点 2 2 系统结构 2 3 调度策略 3 QNX内核 4 QNX网络结构 5 QNX网络设备驱动 6 网络设备信息的统计 2 发展历程 3 应用场景 4 相关链接 1 概述 QNX是一种商
  • Stereo-Detection:YOLO v5与双目测距结合,实现目标的识别和定位测距

    简介 Stereo Detection 是一个传统的SGBM深度测距 yolov5目标检测 并部署在Jeston nano的开源教程 它致力于让更多的大四学生毕业 以及让研一学生入门 开源链接 yzfzzz Stereo Detection
  • Visual Studio运行C语言程序(第一个程序)

    以VS2017为例 首先打开VS 新建Visual C 空项目 建议将编写的程序放在一个文件夹里 并以编写程序当天的日期来命名 在Visual C 里选择C 文件 命名为自己容易认出的名称 后缀为 c就行 右击资源管理器的源文件 选择添加
  • 用Python爬取电影数据并可视化分析_python电影数据分析

    文章目录 一 获取数据 1 技术工具 2 爬取目标 3 字段信息 二 数据预处理 1 加载数据 2 异常值处理 3 字段处理 三 数据可视化 四 总结 一 获取数据 1 技术工具 IDE编辑器 vscode 发送请求 requests 解析
  • Spring refresh() 方法详解(启动Spring,bean的创建过程)

    Spring refresh方法详解 一 refresh 方法预览 二 refresh 方法中调用的每个方法 1 this prepareRefresh 激活开启容器 2 this obtainFreshBeanFactory 获取 bea
  • SQL Server 批量插入数据的两种方法

    在SQL Server 中插入一条数据使用Insert语句 但是如果想要批量插入一堆数据的话 循环使用Insert不仅效率低 而且会导致SQL一系统性能问题 下面介绍SQL Server支持的两种批量数据插入方法 Bulk和表值参数 Tab
  • CSAPP学习记录-Course Overview

    这是我开始学习CSAPP的笔记的第一遍 在接下来的内容 我会分享自己在学习CSAPP时的笔记 感受等等 学习资料来自b站 声明 所有内容基于自己的理解 如有错误感谢大家指出 链接 https www bilibili com video B