首页 > 编程语言 >《深入探索C++对象模型》- 第一章 - 关于对象 - 笔记

《深入探索C++对象模型》- 第一章 - 关于对象 - 笔记

时间:2023-06-15 16:13:59浏览次数:55  
标签:对象 Object C++ 第一章 基类 Data 指针

额外负担:主要由virtual引起

1.1 C++对象模式

简单对象模型(A Simple Object Model)

  • Object
    • ptr1 -> Data 1
    • ptr2 -> Function 1
    • ptr3 -> Function 2
    • ptr4 -> Data 2
    • ……

表格驱动对象模型(A Table-driven Object Model)

  • Object
    • Data member table ptr
    • Member function table ptr
  • Data member table
    • Data 1
    • Data 2
    • ……
  • Function member table
    • ptr -> Function 1
    • ptr -> Function 2
    • ……

C++对象模型

  • Class
    • vtbl(virtual table)
      • vfunc 1
      • v****func 2
      • ……
    • Static Data
      • Static Data 1
      • Static Data 2
      • ……
  • object
    • vptr(virtual pointer) -> vtbl
    • Nonstatic Data
      • Nonstatic Data 1
      • Nonstatic Data 2
      • ……

优缺点

优点:空间和存取时间的效率

缺点修改数据成员不能和代码分开,导致全部重新编译

加上继承

理论

  • 法一直接在对象里面添加若干指向各个基类指针
  • 法二bptr,对象添加一个基类指针,指向基类表,基类表含其所继承的基类
    / 两种方法都是链式查找基类的,比如A->B->C,则C要先找B,再从B找到A

/也可以把所有父类父类的父类保存指针到子类对象,缩短时间,空间占用增大

实际

  • 初期:父类非静态数据成员直接放到子类对象
  • C++ 2.0起
    • 原始模型:法一
    • 演化模型:法二或者把btbl(基类表)塞到vtbl

1.2 关键词所带来的差异

关键词的困扰

  • classstruct混用
  • 混用导致“不一致性”,不符合语法规范

策略性正确的struct

  • C技巧部分依赖内存布局,在Cpp可能不适用
  • 组合而非继承,才是把C和C++结合的唯一方法

1.3 对象的差异

编程范式

  • 面向过程
  • 泛型
  • 面型对象
    混用编程范式易错

支持多态机制

  • 隐式类型转化
    • 如向上类型转换
  • 虚函数(virtual function)
  • 动态类型转换符(dynamic_cast)类型运算符(typeid)

对象内存占用

  • 非静态数据成员总和大小
  • 对齐
  • 虚机制额外开销

指针的类型

影响编译器的解释

cast是种编译器指令

影响覆盖范围

T类指针表明其指向空间大小对应T对象大小

加上多态

  • B从A继承,则向上类型转换
    • 相同指向地址
    • 不同覆盖范围
  • 指针类型决定
    • 可用接口
    • 接口的访问权限
  • 多态只改变解释方式
    • 所以指针引用可以,因为只是改变对内存的解读
    • 实例不行,因为修改内存

OO(Object-oriented)和OB(Object-based)

  • 面向对象基于对象
  • 差别:有无虚机制
  • OB
    • 速度更快,空间更紧凑
    • 比较没弹性

标签:对象,Object,C++,第一章,基类,Data,指针
From: https://www.cnblogs.com/Carykd/p/17483170.html

相关文章

  • oracledb处理游标中的对象类型数据
    如果Oracle定义了以下对象类型1CREATEORREPLACETYPE"TY_RESULT"2ASOBJECT3(4itemCHAR(8),5cntNUMBER(20),67--构造空对象8CONSTRUCTORFUNCTIONTY_RESULTRETURNSELFASRESULT,9);并用于存储过程的返回,放在refcursor中 用以......
  • 《程序员的自我修养》- 第一章 - 温故而知新 - 笔记
    1.1从HelloWorld说起介绍书本的目标读者1.2万变不离其宗讨论范围:兼容x86的32位CPU的PC介绍硬件方面的内容,略1.3站得高,望得远层次鸟瞰应用软件->运行库->操作系统->硬件接口鸟瞰(对应)应用程序编程接口(API)系统调用接口(SystemcallInterface)硬件接口(硬件规格,Hardware......
  • 面向对象编程-获取对象信息
    获取对象类型使用type()type(123)<class'int'>type('str')<class'str'>type(None)<type(None)'NoneType'>type(abs)<class'builtin_function_or_method'>type(a)<class'......
  • C++ 中 switch 的性能优化
    问题有这样一段代码,编译器会傻傻地做多次compare来找到对应分支吗?#include<stdio.h>#include<stdlib.h>intfunc(inti){return(long)(&i)+i+rand();}inttest(intflag){ inti=0; switch(flag){ case0: i+=func(i); break; case1: i+=f......
  • 小议C++函数签名与模板返回类型
    题记:什么事情都要追问一个为什么,真正理解了为什么,才能活学活用。代码1下面的代码能编译通过吗?#include<stdio.h>#include<stdlib.h>classX{public:int*get(){returnnewint();}double*get(){returnnewdouble();}};intmain(){int*v1=X()......
  • C++模板
    1.名词概念模板类,模板函数,特化模板(templatespecialization)2.注意事项模板必须在头文件中实现,以下情况除外:如果只在cpp内用到的模板函数,是可以在cpp中实现的,参见oceanbase/updateserver中的response_data_函数;还有特化的模板函数,也可以在cpp中实现,参见oceanbase/updateserver中的......
  • C++类中static不计算入sizeof
    classMyParam{public:inta;staticintb;intc;staticinty;staticintz;};sizeof(MyParam)=8intMyParam::b=10;intMyParam::z=10;intmain(){MyParamp;MyParamdest;p.a=10;p.b=2;p.c=4;memcpy(&am......
  • C++构造函数复习
    #include<iostream>usingnamespacestd;classElement{public:Element(inte=12):elem(e){cout<<"element1"<<endl;}intelem;};classArrayHelper{public:ArrayHelper(){......
  • 如何寻找 C++ 程序中的大对象?
    问题背景大型应用程序中包含成千上万个C++对象,这些对象大小如何?有没有一些大对象很废?例如,在OceanBase0.4开源版本中Top10的大对象,最大的一个占58MB内存:排序大小类名158,720,304rootserver::ObRootTable2220,163,008updateserver::ObUpdateServerMain320,15......
  • C++ 文件和流
     到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。本教程介绍如何从文件读取流和向文件写入流。这就需要用到C++中另一个标准库 fstream,它定义了三个新的数据类型:数据类型描述ofstream该数据类......