0%

算是一本有点老的书了?因为之前大一的时候打印了出来一只没看,就想着要不找个时间看完算了

High Performance Networking in Chrome

1.2 The Many Facets of Performance

  1. Chrome是作为一个平台来设计的。在Chrome之前的浏览器都是单一进程,每一个页面共享同一个内存空间,如果某一个页面出了问题,那么其他的页面也可能会受到影响。而Chromes是多进程来工作的。每一个tab页面都是一个单独的进程,拥有自己的内存空间以及一个沙箱(sandbox)

  2. 浏览器的工作主要就是三个步骤

    • 获得资源
    • 页面渲染
    • 执行脚本
      其中页面渲染和脚本的执行是单线程并且交错执行的(single-threaded, interleaved model of execution)–无法对DOM进行并发的修改,这其中一部分是因为js本身是单线程执行的语言。所以提速的方向主要是在如何将两者一起结合起来快速的运行。
  3. Chrome使用Blink作为layout引擎。而对于js,Chrome实现了V8 runtime

  4. 浏览器对不同网络资源能够根据其延迟等信息来进行优先级的判定是非常重要的一点

阅读全文 »

  1. 禁止拷贝(或其他操作)
    一般来说,对于普通的功能,我们不想要支持只需要不实现即可,但是对于赋值等操作,如果我们不实现,那么编译器会帮我们自动生成。所以我们可以通过将拷贝函数设定为private的方式来避免调用,然而这样还是可能会出问题,因为友元函数/类的存在,所以还是有机会调用这个函数,所以我们可以通过只声明而不定义拷贝函数,使得调用者在链接的时候报错,从而避免拷贝。

    C++11支持使用delete关键字来非常方便的实现上述功能

阅读全文 »

C++ primer 看到了智能指针什么的,并且之后的几章看的有点粗略,就没有做多少笔记,之后抽时间看,直接开始看effective c++

由于书中的每一个Item涉及到的内容还是很多的,所以在每一个Item当中又会分出几个小点进行记录

  1. 使用constenum以及inline而不是#define
    本节也可以被总结为,使用编译器而不是预处理器

    • const
      const#define最容易产生交叉的点在于对常量的定义,当我们想要定义一个常量的时候,我们可能使用以下两种方式

      1
      2
      3
      #define ASPECT_RATIO 1.653

      const double AspectRatio = 1.653;

      由于在编译的过程中,所有的ASPECT_RATIO将会被完全替换为1.653。如果我们使用的是一个基于符号表的调试器,那么我们可能根本不知道1.653从何而来,尤其是在使用他人编写的头文件中定义了该宏的时候。但是使用const单独定义一个常量将不会有这个问题。而且也有某种可能上,使用const所生成的代码要比使用#define得到的代码更少,因为预处理器的无脑替换,有可能在最终生成的.o文件中有很多重复的1.653,而使用const double按理来说不会超出一个.

阅读全文 »

  1. 成员便变量出现的顺序在成员函数之后,成员函数依然可以使用该成员变量,由于编译器是按照先成员变量再成员函数来处理的
  2. 成员函数默认为inline
  3. this是一个常量指针,指向的对象不是常量,不能对this本身进行修改
  4. structclass的区别在于默认访问权限不同,struct的默认访问权限为public,而class的默认访问权限为private
阅读全文 »

跳过了4,5两章,着实没有什么好记录的

  1. 函数传递默认为值传递,也就是传入的变量会被复制一遍,使用引用为引用调用,原变量会被直接传入,从而避免拷贝,在传入大型类或者容器的时候非常有必要。C中一般使用指针,但是C++中建议将指针都改为引用,但是需要注意的是如果传入的变量在函数调用过程中不会被改变,那么最好是传递一个常量引用

阅读全文 »

  1. 不应该在头文件中使用using,因为会改变所有引用该头文件的文件
  2. string变量的复制是拷贝不是仅仅复制引用
  3. string类型的size以及length方法没有任何区别,一开始只有length方法,后来为了兼容STL,所以引入了size方法
  4. 由于历史原因,c++中的字符串字面量的类型并不是string,但是string类型依然可以直接与字面量进行相加的操作,字面量会自动进行转换
阅读全文 »

  1. 现代的C++程序最使用nullptr而不是NULL由于NULL实际上是一个预处理变量,使用NULL进行初始化与使用0进行初始化没有区别,因为NULL会在预处理阶段被朴素的文本替换为0nullptr是C++11引入的新的字面量

  2. 个人觉得C/C++的变量声明其实算是设计上的失误?

    1
    2
    int *p1, v; // 其中p1为指向int的指针,而v只是简单的int变量,这时候可以认为*是和p在一起的
    const int * p; // p指向的是一个不能被改变的int值,这时候const可以认为是和int在一起的?

    个人认为理解记忆起来还是有点绕

阅读全文 »