Skip to content

核心特性

构造与初始化

//初始化列表

//父类构造函数带参时 子类初始化顺序

//.h,.cpp

//todo:左值引用

内存对齐

对于结构体中的成员,存在以下规则:

  1. 所有成员只能从其字节长度的倍数的内存偏移处进行存储,称为内存对齐。

    例如,对于长度为\(4\)字节的int型数据,只能在\(0\)、\(4\)、\(8\)……等位置存储。

  2. 单个结构体的内存大小必须为其中长度最大的成员的长度的倍数。

    例如,包含int(\(4\)字节)、char(\(1\)字节)型成员的结构体长度必须是\(4\)的倍数,不足时自动填充。

以上规则同样适用于类对象,因为类在存储时的内存模型本质是结构体。

合理的结构体成员声明顺序能够使存储相同数据的结构体占用的内存更小。

成员声明顺序对实例对象的内存长度影响
struct Obj{
    char a;    //1字节
    int b;    //4字节
    char c;    //1字节
}obj;

sizeof(obj);  
//输出结果为12:1+3+4+1+3
//其中int必须在4的倍数处开始排列,因此1和4之间填充了3个字节
//此时共有1+3+4+1=9个字节,为了让结构体长度为最长的成员int的倍数,再填充3个字节,共计12.

//调整成员的声明顺序:
struct Obj{
    char a;    //1字节
    char c;    //1字节
    int b;    //4字节
}obj;

sizeof(obj);  
//此时输出8:1+1+2+4

多态和虚函数表

C++中多态的表现:在父类中定义虚函数并在多个子类重写时,使用指向子对象的父类指针调用该方法会自动匹配对应的子类方法。

C++中的多态依赖虚函数表实现。编译器为类的实例生成对应的内存布局结构体,其中结构体头部(或指定偏移处)存储长度为\(8\)字节的虚函数表指针,指针指向该类对应的虚函数表。

虚函数表中存储了该类重写的虚函数,且默认函数的第一个参数为类的实例对应的布局结构体本身(回调)。