编译器何时生成默认构造函数?

编译器生成的构造函数只适用于编译器的正确性,类内的数据初始化不由编译器负责!

  1. 如果一个class内部含有一个成员对象,并且这个对象有默认构造函数,那么编译器就会为这个class生成默认构造函数。
  2. 此class继承自一个含有默认构造函数的基类。
  3. 带有virtual function的Class或者继承了一个含有virtual fuction的父类。
  4. 使用了虚继承的类。
    存在两个误解:
  5. 任何class如果没有定义默认构造,编译器会生成。(错,编译器只会在需要的时候生成)
  6. 编译器生成的默认构造会明确初始化。(错,编译器不会初始化成员变量,这是程序设计者的活!)
    Read more »

  1. member function类型
  • static member function

  • nonstatic member function

    nonstatic member function 设计原则是和 nonmember效率相同,方法就是隐藏传入一个this指针,重写为外部函数时,函数签名带标识保证全局唯一。

  • virtual function

    虚函数调用时会到虚表找到相关的函数地址,然后传入this指针。例如调用:

    1
    ptr -> func();

    在编译器中会生成:

    1
    (*ptr -> vptr[1])(ptr);
Read more »

构造

  1. 无继承
  • Plain Old Data(纯data)

    1
    2
    3
    4
    typedef struct Point{
    double x;
    double y;
    }Point;

    直接逐bit拷贝,编译器甚至没有生成默认构造和析构函数。

    Read more »

背景知识

  1. Language Representation Learning
    下图展示了NLP的一般网络结构,下面一层是对词进行非上下文的编码,上面一层代表了在具体任务上对词进行基于上下文的编码。
    Read more »

目的

把一个大模型或者多个模型ensemble学到的知识迁移到另一个轻量级单模型上,方便部署。简单的说就是用小模型去学习大模型的预测结果,而不是直接学习训练集中的label。

Read more »

BPE

Read more »