首页 > 试题广场 >

一个对象访问普通成员函数和虚函数哪个更快?

[问答题]
一个对象访问普通成员函数和虚函数哪个更快?
个人感觉要分情况讨论:
1、如果是普通对象访问效率是一样的
2、如果是指针或引用访问,访问普通函数更快
区别:主要在于指针或引用访问虚函数时需要在运行时通过查询虚函数表才能确定要调用的函数的真实地址,而其它形式的访问则在编译时就可以确定要调用函数的地址
发表于 2016-09-09 11:27:35 回复(0)

虚函数调用编译期间无法确定,因此无法内联; 编译器也无法优化虚函数嵌套调用,*** miss概率增大。


发表于 2019-03-31 02:45:43 回复(0)
普通函数快,因为地址在编译期间指定,单纯的寻址调用。
虚函数调用时,首先找虚函数表,然后找偏移地址进行调用。
发表于 2015-07-26 11:12:12 回复(0)
访问普通函数快点,因为普通函数的地址在编译阶段决定,所以访问的时候直接调用相应函数的地址,而虚函数在调用时,需要先建立虚函数表和虚表指针,然后在虚表中找虚函数的地址,所以虚函数慢些。
发表于 2015-07-10 09:48:50 回复(1)
普通函数更快.普通函数的地址在编译期就已经确定了,调用这个函数只需要直接用对应的地址就可以了.调用虚函数时,首先要找到该对象的地址,然后找到该对象虚函数表指针(VPTR)的位置(为了提高查找速度,通常就是该对象的地址),而对象的构造是要到运行时才开始的,这个虚函数表指针也是在运行时才有的,所以虚函数地址是运行期确定的,找到VPTR后根据其指向的虚函数函数指针表得到具体需要调用的函数的地址,相比于普通函数,这个过程复杂,会比较慢.

发表于 2015-06-25 15:40:56 回复(0)
肯定是普通函数更快,因为普通成员函数的地址在编译期间就已经确定,是固定的;
而对象访问虚函数的过程如下:根据添加给对象的vptr,vptr指向虚拟函数表vtbl,vtbl中存放具体的虚函数的地址
发表于 2015-06-18 18:02:39 回复(0)
普通成员函数更快。
普通成员函数的地址在编译阶段已经固定,直接寻址调用即可。
调用虚函数时,首先根据对象保存的虚函数表指针找到虚函数表,然后再找到对应虚函数表项,在根据表中地址去调用虚函数。
发表于 2015-06-11 14:34:58 回复(0)
虚函数在调用时,先根据对象保存的虚函数指针找到保存虚函数的地址的虚表,再根据偏移量找到虚函数的地址,进行调用,而普通成员函数地址已经固定,直接调用,所以普通成员函数的效率会更高些,有人测试过,虚函数大约比普通成员函数慢25%
发表于 2015-06-04 08:33:36 回复(0)
访问普通成员函数更快,因为普通成员函数的地址在编译阶段就已确定,因此在访问时直接调 用对应地址的函数,而虚函数在调用时,需要首先在虚函数表中寻找虚函数所在地址,因此相比普 通成员函数速度要慢一些
发表于 2015-05-05 14:30:27 回复(0)