[CSAPP] 00 课程综述

  1. 整数类型(如int、short等)对于公式x^2 ≥ 0来说是不一定成立的。因为会有溢出的存在。

      short a_2 = 32768;
      std::cout << a_2 << std::endl;
    -----------------------------------
    结果:-32768
    
  2. float类型的结合律(x+y)+z = x+(y+z)不一定成立。

    计算机中,float的取值范围特别大,当两个相差特别大的数进行运算时,可能会使得较小的数字消失,所以不满足结合律。

      float x=1e20, y=-1e20, z = 3.14;
      std::cout<<"(x+y)+z="<<(float)((x+y)+z)<<", x+(y+z)="<<(float)(x+(y+z))<<'\n';
    -----------------------------------
    结果:(x+y)+z=3.14, x+(y+z)=0.0
    
  3. C程序中通常会有内存引用错误

    C和C++并没有提供内存保护,比如有超出边界的数组、非法的指针以及滥用的malloc/free通常都会造成bug,这个bug是否出现,还取决于你的系统和编译器,并且这个bug可能要运行很多次才会发现。这里你可能就需要根据内存的排列方式来对某个数据结构进行修改。

    //比如我们创建一个结构体并对其进行赋值
    typedef struct {
      int a[2];
      double d;
    }demo;
    
    double fun(int i)
    {
      volatile demo s;
      s.d = 3.14;
      s.a[i] = 10773741824; // possibly out of range
    
      return s.d;
    }
    
    进行测试:
      printf("fun(0)=%.10f,fun(1)=%.10f,fun(2)=%.10f,fun(3)=%.10f\n",fun(0),fun(1),fun(2),fun(3));
      printf("fun(4)=%.10f\n",fun(4));
      printf("fun(5)=%.10f\n",fun(5));
    -----------------------------------
    结果:
    fun(0)=3.1400000000,fun(1)=3.1400000000,fun(2)=3.1400003595,fun(3)=-0.0000000000
    fun(4)=3.1400000000 
    //这里到fun(5)时,程序停止运行,而且没计算出fun(5)的值
    

    这其实和数组如何在内存中布局,以及内存是如何访问的相关。我们首先看一下这个结构是如何实现和排列的:

    img

    这里每一行表示4个字节,其中:int是4个字节,double是8个字节。

    • 当我们运行fun(0)fun(1)时,修改的就是数组a中的值;

    • 但是但我们运行fun(2)后,修改的就是浮点数d中的内容了,所以就会出现上面奇怪的数字。

    • 后面的fun(3)≠3.14,是因为double类型8字节,而int类型4字节,所以,int类型需要两次才能走完这8字节,即这一次还是在修改d的内容。

    • fun(4)时,已经过了d。所以,此次输出为3.14。

    • 但当在fun(5)时,程序停止运行,当我们输入到某个值后,我们就修改了某些用来维持该程序运行的状态,这就导致了程序崩溃。

      上图中是在fun(6)时,程序崩溃。这个不同机器结果不同。

      所以内存引用错误主要是因为C和C++没有提供边界检查,所以很容易编写出非法的代码。

  4. There's more to performance than asymptotic complexity

    课程的第四个主题是要从程序角度增加它的性能。CS课程的其他部分,更多强调在正确的数据结构中获得正确的算法,但是他们需要进行不同层次的优化:算法、数据表示、过程和循环。这时候你需要知道系统到底是如何运行的,是什么让它运行很好,以及是什么让它运行不好。

    比如以下两个函数:

    # 代码一
    void copyij(int src[2048][2048],
                int dst[2048][2048])
    {
      int i,j;
      for (i = 0; i < 2048; i++)
        for (j = 0; j < 2048; j++)
          dst[i][j] = src[i][j];
    }
    # 代码二
    void copyji(int src[2048][2048],
                int dst[2048][2048])
    {
      int i,j;
      for (j = 0; j < 2048; j++)
        for (i = 0; i < 2048; i++)
          dst[i][j] = src[i][j];
    }
    

    上面代码的目的都是一样的,都是:都是将一个矩阵或数组从原地址src复制到目标地址dst

    不同点是:唯一的不同仅在于嵌套顺序不同,代码一进行的是行优先,而代码二进行的是列优先的。

    性能方面:在普通的系统中,代码一运行速度为4.3ms,而代码二运行速度为81.8ms,性能相差差不多20倍。

    可以看以下这张图,它显示了四种不同的内存访问模式,这里不会细究,我们可以发现这两个函数在这个内存访问模式中处于不同的位置,copyij代表以行优先形式进行访问,而copyji代表以列优先形式进行访问, 并且copyijcopyji性能好很多,这和内存层次结构中的缓存有关。

    img
  5. 计算机能做的事情远不止执行程序

    课程的最后一部分将更多讨论不仅让计算机孤立运行小程序,而且能够通过网络来彼此交谈,实现像web服务器这样的服务。

参考:

https://zhuanlan.zhihu.com/p/103768843

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352