《深度探索C++对象模型》读书笔记——第一章(关于对象)
2015-11-24 00:26
267 查看
1.C++的封装并不会增加布局成本,数据封装和普通结构体一样·,而行为封装,也不会增加。因为非内联函数,只会诞生一个实例。但是内联函数,则会在每一个使用者上诞生一个实例。
C++在布局上的额外负担主要是由virtual机制引起的:
(1)Virtual Function机制
(2)Virtual base class机制
(3)还有就是多重继承下产生的额外负担
C++中,有两种数据成员,静态和非静态。有三种成员函数,静态,非静态和虚函数。
2.第一种对象模型(简单对象模型)
就是在模型中,只保留类内各成员的指针,完全通过指针进行索引。
这样可以避免”members有不同的类型,因而需要不同的存储空间”所招致的问题。
而,一个类对象的大小也很好确定,它的成员的数量乘以指针的大小即可。
3.第二种对象模型(表格驱动对象模型)
在这个提出的模型里,我们将所有与成员相关的信息提取出来,放在一个数据成员表盒一个成员函数表中。而对象本身则内含指向两个表的指针。成员函数表中是一系列接口,每个接口指向对应的成员函数。数据成员表中则是直接存放的数据本身。
4.第三种对象模型(C++对象模型)
在这个模型里,非静态数据成员被分配在每个类对象中,静态数据成员在存放在所有对象之外。静态成员函数和非静态成员函数都存放在对象之外,及所有对象公有一份实例。
虚函数则用两个步骤支持:
1.每一个类产生一堆指向虚函数的指针存放在表格中,称为虚函数表virtual table(vtbl)
2.每一个类对象被安插一个指针,指向相关的虚函数表。通常这个指针被称为vptr。
5.一个类对象的大小包括
a) 非静态数据成员的大小
b) 内存补齐所占有的空间
c) 虚机制额外的内存开销
C++在布局上的额外负担主要是由virtual机制引起的:
(1)Virtual Function机制
(2)Virtual base class机制
(3)还有就是多重继承下产生的额外负担
C++中,有两种数据成员,静态和非静态。有三种成员函数,静态,非静态和虚函数。
2.第一种对象模型(简单对象模型)
就是在模型中,只保留类内各成员的指针,完全通过指针进行索引。
这样可以避免”members有不同的类型,因而需要不同的存储空间”所招致的问题。
而,一个类对象的大小也很好确定,它的成员的数量乘以指针的大小即可。
3.第二种对象模型(表格驱动对象模型)
在这个提出的模型里,我们将所有与成员相关的信息提取出来,放在一个数据成员表盒一个成员函数表中。而对象本身则内含指向两个表的指针。成员函数表中是一系列接口,每个接口指向对应的成员函数。数据成员表中则是直接存放的数据本身。
4.第三种对象模型(C++对象模型)
在这个模型里,非静态数据成员被分配在每个类对象中,静态数据成员在存放在所有对象之外。静态成员函数和非静态成员函数都存放在对象之外,及所有对象公有一份实例。
虚函数则用两个步骤支持:
1.每一个类产生一堆指向虚函数的指针存放在表格中,称为虚函数表virtual table(vtbl)
2.每一个类对象被安插一个指针,指向相关的虚函数表。通常这个指针被称为vptr。
5.一个类对象的大小包括
a) 非静态数据成员的大小
b) 内存补齐所占有的空间
c) 虚机制额外的内存开销
相关文章推荐
- 字符串变整数,atoi()
- 子字符串查找
- C语言移位运算符
- C++ 引用计数(reference count) 实现智能指针
- C语言从命令行接收参数
- C语言中快速排序和插入排序优化的实现
- C语言下载网页源代码并保存到本地磁盘
- [C/C++][文件操作] 对比目录并列出同名较新文件、较旧文件 0.1
- 求数组相邻元素差值的最大值快速算法(C++版)
- strlen函数实现——string.h库函数
- c语言:分别使用for循环和while循环求5!
- 面试之C++题目汇总7
- c语言:输出(Welcome??)和(Welcome\?\?)
- 面试之C++题目汇总6
- 使用Java中的JNI技术将C/C++程序嵌入到Java代码中实现Hello World
- 面试之C++题目汇总5
- 面试之C++面试题汇总4
- 面试之C++面试题汇总3
- c语言:有趣的转义字符用法
- c语言:对于一个变量n,const用法和指针的比较