C++对象模型
来源:互联网 发布:mac硬盘新建文件夹 编辑:程序博客网 时间:2024/06/03 21:33
C++中有两种数据成员:
- 静态
- 非静态
三种成员函数:
- 静态
- 非静态
- 虚函数
- 非静态数据成员在对象之内
- 静态数据成员在对象之外
- 静态、非静态成员函数在对象之外
- 类中存在虚函数时,一个类对应一个virtual table(vtbl)放在对象之外,对象中安插一个指针vptr指向这个表。但vptr放在对象的什么位置上要视编译器而定。vptr的设置由构造、析构、赋值运算符函数自动完成。
C++对象模型如下图所示:
每个类相关联的信息由vtbl内的一个slot指出,用来支持RTTI机制。
测试例程:
#include <iostream> using namespace std; class A {public: int x, y; static int s; void f1() { } static void f2() { } virtual void f3() { }};int A::s = 123; int main(){ cout << "size = " << sizeof(A); return 0;}
运行结果:
可以看出,对象所在内存中只包含有整型变量x、y、vptr,其它成员全部存在于对象之外。
下面讨论继承体系下的对象模型。下面这个测试例程有点意思:
#include <iostream> using namespace std; class A {public: int x, y; }; class B: public A {}; class C: virtual public A {}; int main(){ cout << "class B size = " << sizeof(B) << endl; cout << "class C size = " << sizeof(C) << endl; return 0;}
运行结果:
类C采用了虚继承,内部就多了四字节。这是由于虚继承的特性决定的:在虚拟继承情况下,基类(虚基类)不管在继承链中被派生多少次,永远只会存在一个实例。和virtual table类似,也存在一个指针表(virtual base class table),表中每个指针指向一个虚基类地址,在对象中也安插一个指针指向这个表(微软的编译器就采用了这种做法)。所以类C才会增加了四字节空间。同时,基类(不管是不是虚基类)的数据成员直接被放置于派生类对象中。所以,class C所占空间为8+4=12字节。
如果有如下class:
class X {public: virtual ~X() {} virtual void foo() {} private: int a, b;};
那么class X的模型应该如下所示:
环境:
Win7 + VS2013
参考:
《深度探索C++对象模型》 P9-P13.
0 0
- Objective-C对象模型
- Objective-C对象模型
- objective C 对象模型
- C ++ 对象模型
- Objective-C 对象模型
- 【C++】对象模型
- Objective-C对象模型
- C/C++的对象模型
- Objective-C的对象模型
- 图解Objectvie-C对象模型
- C/C++的对象模型
- Objective-C对象模型--类对象和元类对象
- 深度探索C++对象模型
- Objective-C 对象和消息模型
- Objective-C对象模型及应用
- Objective-C对象模型及应用
- Objective-C对象模型及应用
- Objective-C对象模型及应用
- 位运算与组合搜索(一)
- 泛型与RTTI的关系小议
- 简单的自动测试系统
- [2012.7.20]易语言post教程 - 飞龙
- 各种字符串函数(strcpy,strcmp,strlen)之深度剖析
- C++对象模型
- ADF Essentials
- 小游戏“盗宝奇侠”
- 【Linux之路】进程间通信
- css中display:inline-block
- 架构师-我的新梦想
- 黑马程序员-Java基础知识5(部分笔记总结)
- use the isrsupc Program for search
- Mac下cocos2dx-3.0打包Android时,提示"SimpleAudioEngine.h"not found的解决方法