C++ 对象模型

it2026-04-16  2

C++ 对象模型 虚函数机制, 实现执行器绑定 虚基类机制, 实现多继承体系中只有一个共享实体; 非静态数据成员放在 object 之中 静态数据成员放在 object 之外 静态和非静态成员函数都放在 object 之外 每个类会产生一堆指向虚函数的指针, 放在一个表格( vbtl) 中, vbtl 的第一个 slots 放置 type_info( 用以支持 RTTI) 信息 每个 object 产生一个指针( vptr) 指向这个虚表, vptr 的设定和重置由, 构造、 析构、 拷贝 复制函数完成, 虚拟多继承, 虚基类表, 每个对象都有一个指向虚基类共享数据的指针 默认构造器自动生成条件 带有 默认构造器的 成员类 object 带有 默认构造器的 基类 带有 虚函数的 类 带有 虚基类的 类 以上 4 中情况会编译器会产生一个 暗中不可以忽略的默认构造器, 这个构造器仅供编译器 使用; ( 浅拷贝) bitwise ( 深拷贝) memberwise NRV 就是当返回一个 class object 的函数, 编译器转换为多传递一个引用参数方式, 就可以 减少一次拷贝构造的调用; 必须使用初始化列表的情况 初始化引用 初始化 const 成员 调用基类构造器。 而它有一组参数 调用一个成员类的构造器, 而它拥有一组参数 初始化列表初始化顺序是按照声明的顺序初始化的, 而不是初始化列表的顺序初始化 C++ 对象模型会把数据存放在每一个 class objec 之中, 对于继承而来的数据成员也是如此; class object 的大小还可能会受到 virtual 机制的影响和内存对齐的影响; 非静态成员在 class obje 中的排列顺序和声明的顺序一样 单一继承内存布局 多重继承内存布局 所有编译器的做法是把 vptr 放在队象的头部, 就是放在对象的尾部; C++语言要求同一个访问等级的 data 成员排列次序必须和声明的次序一致; 普通成员函数 对普通成员函数添加一个 this, 然后重新封装一个函数 单继承关系虚函数表内存布局: 带有虚函数的多继承扩展类内存布局 建议不要再虚基类中声明 nostatic 成员变量 普通成员函数指针, 在没有虚函数, 多继承, 虚拟继承的情况下, 使用成本不会增加; thunk 是比较有效率的一种, thunk 将虚表中本来存放虚函数地址改为存放指向一小段代码 的指针, 这一段代码用来调整 this 的值, 这种技术就被称为 thunk。 默认拷贝函数不会出现浅拷贝语义的情况  含有成员对象, 该对象的类提供了拷贝赋值函数  继承自一个基类, 基类定义了拷贝赋值函数  当一个类含有虚函数时  一个类虚拟继承自一个类; delete p;只会释放其指向的内存, 不会把指针清零( =nullptr) 对象的构造是先申请内存, 然乎调用构造函数, 对象的析构则是先调用析构函数, 在释放内 存; 一个对象的大小 1、 非静态成员的大小 2、 内存对齐所需要的大小 3、 指出 virtual 多态所需要的大小 指针的类型会告知编译器某个特定地址的中内存的内容和大小  

最新回复(0)