可能重复:
虚函数和性能C ++

这是正确的,类成员函数比简单函数需要更多时间吗? 如果使用继承和虚函数怎么办?

我试图将我的函数收集到一个简单的接口类(只有成员函数,没有数据成员),看来我浪费时间。 有办法解决吗?

PS我正在检查gcc和icc编译器并使用-O3选项。

===============>>#1 票数:9 已采纳

过早优化是万恶之源

非静态成员函数接受一个附加参数,该参数是调用该函数的对象(指向它的指针或引用)。 这是一个开销。 如果函数是虚函数,那么在多态调用的情况下也存在一个小的间接,即,将函数索引添加到虚拟表基本偏移量。 这两个“开销”都是可以忽略不计的,你不应该担心,除非探查者说这是你的瓶颈。 最有可能的不是。

过早优化是万恶之源

===============>>#2 票数:5

成员函数,如果它们不是虚拟的,则与自由函数相同。 它的调用没有开销。

但是,在virtual成员函数的情况下,存在开销,因为它涉及间接 ,即使这样,当通过指针引用 (称为多态调用)调用虚函数时它也会变慢。 否则,如果调用不是多态的 ,则没有区别。

===============>>#3 票数:3

成员职能不涉及额外的时间惩罚。 虚函数略慢但不是很多。 除非你运行一个非常紧凑的循环,否则即使虚函数开销也可以忽略不计。

===============>>#4 票数:2

对于正常功能来说,它足够“跳”到它们,这非常快。 普通成员函数也是如此。 另一方面,虚函数,跳转到的地址必须从表中获取,这当然涉及更多的机器代码指令,因此会更慢。 但是,差异可以忽略不计,甚至几乎不可测量。

换句话说,不要担心。 如果你有减速,那么最有可能(比如99,999%)别的东西。 使用分析器找出位置。

  ask by klm123 translate from so

未解决问题?本站智能推荐:

5回复

成员函数静态变量vs成员变量[重复]

这个问题已经在这里有答案 : 5年前关闭。 静态变量与成员变量 (4个答案) 在成员函数内部使用静态变量而不是成员变量的良好做法是否是应该在函数调用之间
6回复

成员函数与非成员函数?

对类操作的函数应该是成员函数还是非成员函数的规则是什么? 例如,我有一个使用bools矩阵表示迷宫的类。 我正在创建一个名为isConnected的函数,它验证迷宫中的2个点位于同一区域(即可以从A行进到B)。 这应该是会员还是非会员? 什么是好规则?
5回复

定义内部成员函数与类定义之外的成员函数之间是否存在差异?

考虑以下四个成员函数声明和定义: 为了完整性,这里是实例化X并调用方法的.cpp文件... 我的问题:这四种方法之间是否存在显着差异? 我从这篇文章的评论中了解到,编译器可以自动内联在类定义中定义的方法。 更新 许多答案都假设我在询问内联与否之间的区别。 我不是。
1回复

访问类的Private成员函数[重复]

这个问题已经在这里有了答案: 如何对C ++类的私有成员(和方法)进行单元测试[重复] 8个答案 我有一个A类,其中包含许多私有/公共成员函数/变量。 我向它添加了一个新的私有成员函数。 作为测试新添加的方法的一部分,我需要从测试类中调用私有成员函数。 对于成
6回复

关于类成员函数指针的sizeof [重复]

这个问题在这里已有答案: 指向成员的指针代表 2个答案 假设我们有A级 和这些typedef 我的问题是为什么sizeof(a_func_ptr)返回16,而sizeof(func_ptr)返回4(对于x86系统上的任何指针)? 例如
3回复

如何使用SetWindowLong解决类成员函数? [重复]

可能重复: 将指针传递给成员函数 当我离开班级时, WNDPROC DefEditProc; 和EditKeyProc都可以。 但是现在当我粘贴代码时,它编译失败并出现错误error: invalid use of member function (did you forge
4回复

C ++新手的类成员函数[重复]

这个问题已经在这里有了答案: Visual Studio 2015“非标准语法; 使用“&”创建指向成员的指针” 3回答 我是C ++的新手,我目前正在学习考试,在VisualStudio中使用C ++并进行一些试验。 通常,我使用Java。 我编写了一个
3回复

c ++成员函数和类大小[重复]

可能重复: 为什么类大小只取决于数据成员而不取决于成员函数? 当我第一次学习继承时,我的老师评论说,与数据成员相反,成员函数不会改变类的大小。 也就是说,如果B类继承自A类,那么B的大小将大于A的大小,当且仅当至少添加一个数据成员时,并且不会相对于函数成员数量进行更改。 这是
2回复

如何定义模板类的模板成员函数[重复]

可能重复: 如何在类定义之外的模板类中定义模板函数? 我正在努力解决模板类中模板成员函数的情况: 第一个成员函数很好,但处理模板类的基本类型以外的类型的模板成员函数是我遇到问题的地方。 对于上述情况,我收到以下错误: 我还尝试了Bar的模板版本所能考虑的所有其他
4回复

静态与const成员函数

我发现很难决定何时使用私有静态成员函数以及何时使用私有const成员函数。 假设我们有一个方法DoSomething(),该方法需要检查一个或多个成员是否是某种东西: 当一个辅助函数仅以一种方式使用(例如仅检查a_是否是某种东西)时,我倾向于使用const成员函数。 如果将它与几个参数一起使用