C++对象模型之函数成员(5)

原创 2004年01月27日 21:09:00

1.1.   指向成员函数的函数指针

1.1.1. 静态成员函数指针

double (Point::*coord)() = &Point::x;

coord指向的是x的实际地址。

1.1.2. 非虚拟非静态成员函数指针

double (Point::*coord)() = &Point::x;

指针取得的是x在内存中的真正地址,但这个值不完全,他需要被绑定在某个class object的地址上,才能调用该函数。上述的指针调用:

a)(origin.*coord)();

b)(ptr->*coord)();

会被转化成为:

a)(coord)(&origin);

b)(coord)(ptr);

这样的调用成本,如果不用virtual、多重继承或virtual base class的话,并不比非成员函数指针高。

1.1.3. 虚拟成员函数指针

double (Point::*coord)() = &Point::x;

指针取得的是x在virtual Table中的索引值。

(ptr->*coord)();

会被转化为:

(*ptr->vptr[(int)coord])(ptr);

那么如何才能够知道coord使地址还是索引呢?这就必须引入一个更一般如下的规则。

1.1.4. 多重继承下的成员函数指针

0001   struct _mptr
0002   {
0003     int delta;  //this
指针的offset

0004     int index;  //vtbl
中的索引值
0005     union 
0006     {
0007       ptrtofunc faddr;  //
函数地址
0008       int v_offset;     //virtual
或多重继承的第二个或后继的Base Classvptr

            //的位置,如果vptr放在对象的开头,就没有用了,代价是兼容

//性降低
0009     };
0010   };

(ptr->*coord)();

会被转化为:

(coord.index < 0)

?  //非虚函数

(*coord.faddr)(ptr)

:  //虚函数

(*ptr->vptr[coord.index](ptr));

1.2.   函数效率

效率

名称

 

 

 

 

 

内联函数(Inline menber)

非成员函数(Nomember)

静态成员函数(static member)

非静态成员函数(Nostatic member)

虚函数(virtual member)

多重继承虚函数(virtual member)

虚拟继承虚函数(virtual member)

1.3.   函数指针效率

效率

名称

 

 

 

 

 

指向非成员函数的指针

指向成员函数的指针

多重继承的非虚函数指针

虚继承的非虚函数指针

指向虚成员函数的指针

多重继承的虚成员函数的指针

虚继承的虚成员函数的指针

C++类对象成员变量和成员函数内存分配的问题

(转载自:http://blog.sina.com.cn/s/blog_4feac7b90101keet.html) 很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有...
  • njustzj001
  • njustzj001
  • 2015年01月12日 20:26
  • 2803

C++类的成员函数存储方式(是否属于类的对象)

今天在看TAF源码的时候,发现下面一段有趣的代码:getSmallerProxyPrx = Application::getCommunicator()->stringToProxy(MobileA...
  • jiange_zh
  • jiange_zh
  • 2016年07月10日 15:42
  • 2260

一个类的对象作为另一个类的数据成员时如何构造函数

一个类的对象作为另一个类的数据成员。        一个类中的数据成员除了可以是int, char, float等这些基本的数据类型外,还可以是某一个类的一个对象。用子对象创建新类。     ...
  • HighKit
  • HighKit
  • 2013年04月02日 16:38
  • 10443

C++类对象内存模型与成员函数调用分析(中)

2.4 虚拟成员函数 这 是本文中最复杂也最有趣的话题了。虚拟函数也是和继承这个话题相伴相生,所以本节将纳入对单继承、多重继承和虚拟继承,一起描述他们之间的...
  • xiaomoniao
  • xiaomoniao
  • 2013年12月13日 18:01
  • 260

C++类对象内存模型与成员函数调用分析(下)

多重继承下的虚拟函数 多重继承下的虚拟函数主要有一下几个麻烦: 1.         几个父类都声明了相同原型的virtual函数; 2.         有不止一个父类将其析构函数声明为虚...
  • darennet
  • darennet
  • 2014年11月07日 20:21
  • 400

C++类对象内存模型与成员函数调用分析(中)

2.4 虚拟成员函数这是本文中最复杂也最有趣的话题了。虚拟函数也是和继承这个话题相伴相生,所以本节将纳入对单继承、多重继承和虚拟继承,一起描述他们之间的关系,这样,对C++对虚拟函数的调用,以及由此所...
  • fairyroad
  • fairyroad
  • 2011年04月30日 17:58
  • 4500

C++类对象内存模型与成员函数调用分析(中)

原文:http://blog.csdn.net/fairyroad/article/details/6376632 2.4 虚拟成员函数 这 是本文中最复...
  • u011779269
  • u011779269
  • 2014年04月28日 21:18
  • 359

C++类对象内存模型与成员函数调用分析(下)

2.4.2 多重继承下的虚拟函数 多重继承下的虚拟函数主要有一下几个麻烦: 1.         几个父类都声明了相同原型的virtual函数; 2.         有不止一个父类将其析构...
  • xiaomoniao
  • xiaomoniao
  • 2013年12月13日 18:01
  • 211

C++类对象内存模型与成员函数调用分析(中)

虚拟成员函数 这 是本文中最复杂也最有趣的话题了。虚拟函数也是和继承这个话题相伴相生,所以本节将纳入对单继承、多重继承和虚拟继承,一起描述他们之间的关系,这...
  • darennet
  • darennet
  • 2014年11月07日 20:19
  • 399

深度搜索C++对象模型 Function 语意学-虚拟成员函数

1 这一节主要讨论虚函数,以及关于
  • ZHANG2012LIANG
  • ZHANG2012LIANG
  • 2014年07月21日 14:27
  • 597
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++对象模型之函数成员(5)
举报原因:
原因补充:

(最多只允许输入30个字)