初识汇编-知识点摘记

汇编语言的由来

  • 汇编语言是基于机器语言(由0或1组成)而产生的一种助记符
  • 汇编语言介于机器语言和高级语言之间
  • 汇编语言与机器语言是一一对应关系,每条机器指令都有对应的汇编指令
  • 汇编语言通过编译得到机器语言,反之机器语言也可通过反汇编得到汇编语言
  • 高级语言通过编译得到汇编语言,但是汇编语言不能反汇编成高级语言,因为高级语言与汇编之间是多对一的关系。
Read more

关于真相的一点想法

都说现在的人越来越浮躁,愿意思考的人越来越少,导致整个社会都显得浮躁不安。我觉得其实我们一直以来都是这样的,与这个时代的关系不大。之所以当代人会这么认为,是因为大多数人相较于不熟悉的历史更了解自己当下生活的年代。一旦自己所处的社会没有达到自己的预期,往往更愿意相信以前的年代比现在更好,人也更单纯。现在网络上很多人都在追捧民国时代,认为那个年代更加自由与开明。这是因为他们看到的都是民国精英贵族的事迹,认为自己如果生活在那个年代会同样的潇洒与自由,但是如果你深入了解了民国普通老百姓的生活你就不会这么认为了,毕竟你我都是属于普通阶层。

Read more

《Effective Modern C++》条款24:区分万能引用和右值引用

简述

万能引用和右值引用都用”T&&“表示。

  • 万能引用

    所谓万能引用,即它既可以绑定左值,又可以绑定右值。一般用于表示型别推导的结果。

  • 右值引用

    右值引用,顾名思义就是只能绑定到右值,它的主要作用是作为可移动对象的标识。

Read more

《Effective Modern C++》条款23:理解std::move和std::forward

简述

  • std::move

    std::move,即移动语义。它的设计初衷在于让编译器用一种低成本的移动操作替换昂贵的复制操作。与之相关的两个函数分别是移动构造函数和移动赋值运算符。

    此外,std::move使得创建一个只可移动不可复制的对象成为可能,比如std::unique_ptr、std::future和std::thread等。

  • std::forward

    std::forward,即完美转发。它的设计初衷是使对任何一个函数模板,都可以将当前函数所接受的实参原封不动地转发给其它函数,且目标函数接受到的实参与传入当前函数的实参完全相同,包括实参的左右值属性。

  • 形参总是左值

    所谓左值,简单地说就是可寻址变量,而右值则是不可寻址的临时变量。

    1
    2
    3
    int a = 3;  // a是左值,3是右值
    a = a + 1; // 等号左边的a是右值,等号右边的a是右值
    // CPU取a的值存入临时变量,即寄存器,然后+1,再将寄存器的值赋值给a

    实参既可以是左值,也可以是右值。而形参总是左值,原因在于形参是为了传递实参的值或指针或引用而出现的,因此必须是可被赋值的左值。即便形参的类别是右值引用,如下:

    1
    void fun(Widget&& w);  // 形参w是一个左值
Read more

《Effective Modern C++》条款8:表示空指针优先选用nullptr,而非0或NULL

简述

  • 字面常量0的型别是int,而非指针。C++会在只能使用指针的语境中才勉强将其解释为空指针。

  • NULL是一个宏定义,而非指针。同样,C++会在只能使用指针的语境中才勉强将其解释为空指针。

    1
    2
    3
    4
    5
    6
    7
    8
    /* Define NULL pointer value */
    #ifndef NULL
    #ifdef __cplusplus
    #define NULL 0
    #else /* __cplusplus */
    #define NULL ((void *)0)
    #endif /* __cplusplus */
    #endif /* NULL */
  • nullptr是C++关键字,不具备整型型别。实际上,它也不具备指针型别,但是它可以隐式转换成任意指针型别,这也就是为什么nullptr可以用于初始化所有指针型别的原因。

Read more