CSAPP学习记录-Course Overview

这是我开始学习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会频繁涉及到页面置换,消耗大量时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值