C++虚函数和消息映射机制
来源:互联网 发布:扛旗世界纪录 知乎 编辑:程序博客网 时间:2024/04/30 05:01
派生类重写基类的函数一般有两种方法:虚函数(C++),消息映射(smalltalk,Objective-C,MFC,Qt)
1.C++虚函数实现机制
每个有虚函数的类都有一个虚表,并且在内存对象的布局中,第一项就是指向这个虚表的虚指针。
class A
{
public:
virtual void f();
virtual void g();
private:
int a;
};
class B
{
public:
void g();
private:
int b;
};
B bB;
A *pa = &bB;
bB对应的内存布局:
vptr
A::a
B::b
vptr指向的虚表:
A::f()
B::g()
pa的结构就是A的布局,即pa只能访问到bB对象的前两项,访问不到第三项B::b,在编译阶段编译器将索引和表项做好,当编译到pa->g()时,将其转换成call *(pa->vptr)[1],这就是C++的静态编译,所以执行效率高,但是当A的虚函数比较多时(比如1000个),而B重写的比较少(比如2个),这时B类型的每个对象的虚表中的998个表项都是为了放A中的虚函数的入口地址,这样就浪费了很多空间。
2.消息映射机制
这种方法是按照函数名称查表,这种方法不需要所有的B类型的所有对象都存储虚表,但是这种方法要在所有的虚函数中进行查找,并且在Objective-C中,采取动态绑定机制,在运行时查找指定函数名,因此执行效率比较低,但是Objective-C中有一个@selector,对每个函数名进行编码,这样可以快速地找到指定函数名。因为在MFC中的派生体系比较庞大,但是重写函数不多,因此MFC采用消息映射机制才能达到较高的效率。例如很多GUI库都采用这种机制,例如MFC,Qt。
1.C++虚函数实现机制
每个有虚函数的类都有一个虚表,并且在内存对象的布局中,第一项就是指向这个虚表的虚指针。
class A
{
public:
virtual void f();
virtual void g();
private:
int a;
};
class B
{
public:
void g();
private:
int b;
};
B bB;
A *pa = &bB;
bB对应的内存布局:
vptr
A::a
B::b
vptr指向的虚表:
A::f()
B::g()
pa的结构就是A的布局,即pa只能访问到bB对象的前两项,访问不到第三项B::b,在编译阶段编译器将索引和表项做好,当编译到pa->g()时,将其转换成call *(pa->vptr)[1],这就是C++的静态编译,所以执行效率高,但是当A的虚函数比较多时(比如1000个),而B重写的比较少(比如2个),这时B类型的每个对象的虚表中的998个表项都是为了放A中的虚函数的入口地址,这样就浪费了很多空间。
2.消息映射机制
这种方法是按照函数名称查表,这种方法不需要所有的B类型的所有对象都存储虚表,但是这种方法要在所有的虚函数中进行查找,并且在Objective-C中,采取动态绑定机制,在运行时查找指定函数名,因此执行效率比较低,但是Objective-C中有一个@selector,对每个函数名进行编码,这样可以快速地找到指定函数名。因为在MFC中的派生体系比较庞大,但是重写函数不多,因此MFC采用消息映射机制才能达到较高的效率。例如很多GUI库都采用这种机制,例如MFC,Qt。
- C++虚函数和消息映射机制
- 消息映射机制和自定义消息
- 第一章 2. CPaintDC 和 消息映射机制
- 4MFC消息映射机制和CDC
- MFC消息映射和处理机制整理
- 消息处理机制:CCmdTarget 和 消息映射表
- 消息处理机制:CCmdTarget 和 消息映射表
- 消息处理机制:CCmdTarget 和 消息映射表
- VC----消息处理机制:CCmdTarget 和 消息映射表
- MFC消息映射机制
- MFC消息映射机制
- 消息映射机制
- MFC消息映射机制
- MFC消息映射机制
- MFC消息映射机制
- 消息映射机制
- MFC消息映射机制
- vc消息映射机制----------------
- 到CSDN上课的感受
- 注册不久
- python中文decode和encode转码
- The execute sequence when using the WHERE and GROUP BY Clauses Together
- 快速配置 Samba 将 Linux 目录映射为 Windows 驱动器,用于跨平台编程
- C++虚函数和消息映射机制
- 将Linux代码移植到Windows的简单方法
- 网络流题目
- (转载)收集android事件处理,按键、触摸屏部分
- 网络流
- 代码行数统计工具SourceCounter
- android定时定位 - 利用百度定位API来实现定时定位功能
- java.lang.NoSuchFieldError: NONE
- pax-exam+maven应用于osgi的集成测试