第一章 关于对象
来源:互联网 发布:vb.net数据库放到内存 编辑:程序博客网 时间:2024/05/16 23:38
1.加上封装后的布局成本
不同函数没有增加成本。
额外负担是由virtual引起的。
virtual function
virtual base class
1.1c++对象模型
class data member:static, nostatic
class member functions:static, nostatic, virtual
class Point{
public:
Point(float xval);
virtual ~Point();
float x() const;
static int PointCount();
protected:
virtual ostream& print(ostream &os) const;
float _x;
static int _point_count;
}
简单对象模型
一个object是一系列的slots,每一个slot指向一个members。Members按其声明次序,各被指定一个slot。每一个data member或function member都有自己的一个slot。
Point pt
--------------------------------------
| *-----|-------------------------->Point::Point(float)
--------------------------------------
| *-----|-------------------------->Point::~Point()
--------------------------------------
| *-----|-------------------------->float Point::x()
--------------------------------------
| *-----|-------------------------->int Point::PointCount()
--------------------------------------
| *-----|-------------------------->ostream& Point::print(ostream&);
--------------------------------------
| *-----|-------------------------->float Point::_x
--------------------------------------
| *-----|-------------------------->int Point::_point_count
--------------------------------------
表格驱动对象模型
将members抽出来,放在一个data member table和一个member function table之中,class object本身则内含指向这两个表格的指针
Point pt
member data table
-------------------------------------- -----------------------
| *-----|---------------------------------------------->| _x |
-------------------------------------- --------------------------- -----------------------
| *-----|--------->| | | _point_count |
-------------------------------------- --------------------------- -----------------------
| |
---------------------------
member function table
c++对象模型
nonstatic data members 被配置于每一个class object之内,
static data members则被存放在所有的class object之外
static和nonstatic function members也存放在所有的class object之外
virtual functions则以两个步骤支持:
1.每一个class产生出一堆指向virtual functions的指针,放在表格之中,这个表格被称为virtual table (vtbl)
2.每一个class object被添加一个指针,指向相关的virtual table。被称为vptr,vptr的设定和重置都由每一个class的constructor,destructor和copy assignment运算符自动完成。每一个class所关联的type_info object(用于支持runtime type identification,RTTI)也经由virtual table被指出来,通常是放在表格的第一个slot处。
1.2关键词所带来的差异
1.3对象差异
1.程序模型
2.抽象数据类型模型
3.面向对象模型
内存大小:
nonstatic data members的总和大小
由于alignment的需求而填补上去的空间。
加上为了支持virtual而由内部产生的任何额外负担
“指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小。
Bear b;
zooAnimal *pz = &b
Bear *pb = &b;
它们都指向Bear object的第一个byte,差别:pb所涵盖的地址包含整个Bear object,而pz所涵盖的地址只包含Bear object中的zooAnimal subobject。
除了ZooAnimal subobject中出现的members,你不能够使用pz来直接处理bear的任何members。唯一例外是通过virtual机制
pz的类型将在编译器决定一下两点:
固定的可用接口
该接口的Access level
对于virtual function,类型信息并不是维护与pz之中,而是维护于link之中,此link存在于object的vptr和vptr所指之virtual table之间。
- 第一章 关于对象
- 第一章 关于对象
- 第一章 关于对象
- 第一章 关于对象
- 第一章 关于对象笔记
- 第一章 关于对象
- 第一章 关于语言,对象
- 第一章 关于对象
- 第一章 关于对象
- 第一章 关于对象(二)
- C++ 对象模型 第一章 关于对象
- 第一章:关于对象(Object Lesson)
- 深度探索C++对象模型第一章 关于对象
- 【深度探索C++对象模型】第一章 关于对象
- 深入探索C++对象模型 第一章 关于对象
- C++对象模型——关于对象(第一章)
- C++对象模型——关于对象(第一章)
- 《深入探索C++对象模型》笔记之第一章关于对象
- 迭代开发过程及一些原则
- iPhone 路径大全
- 正确重置MySQL密码
- DataGrid自定义右键
- 从A到Z来说说Web开发
- 第一章 关于对象
- C# 值类型和引用类型的内存管理
- 为什么用VC++6.0时点打开文件时总弹出“ox5003eaed”指令引用的“ox00000000”内存。该内存不能为“read”
- NDK: No implementation found for native
- VS的多线程调试问题
- window 下 mysql 启动 二进制日志文件
- JAVA多线程
- USB接口IC读写器oem软件_AB密码完整解决方案/读写卡测试程序及源代码/c++builder源代码
- 分布式服务平台的协议设计