问题标签 [virtual-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
996 浏览

java - 提高可比性比较性能

我分析了我的代码,发现我的类实现Comparable<T>了 8 倍以上的 cpu 时间

比在

我认为减速是因为此方法的虚拟表查找。


有没有办法强制静态调用函数?(就像在非虚拟 C++ 方法中一样)

我仍然想使用Comparable<T>接口,因为我使用TreeSet了这个对象并且我不想重写这个代码。


编辑:不,我没有实现compareTo(Object) - 这是由探查器自动生成和报告的

0 投票
4 回答
2232 浏览

language-agnostic - 什么是(或应该是)虚函数调用的圈复杂度?

圈复杂度为理解给定函数的难易程度或包含错误的潜力提供了一个粗略的衡量标准。在我读过的实现中,通常所有基本的控制流构造(if、case、while、for 等)都会将函数的复杂度增加 1。在我看来,圈复杂度旨在确定“通过程序源代码的线性独立路径的数量”虚拟函数调用也应该增加函数的圈复杂度,因为在运行时将调用哪个实现的模糊性(调用在路径中创建另一个分支执行)。

但是,如果函数包含等效的 switch 语句(每个“case”关键字一个点,实现相关虚函数的层次结构中的每个类一个 case 关键字),对函数进行相同的惩罚,感觉过于苛刻,因为虚函数调用通常被认为是更好的编程实践。

虚函数调用的圈复杂度成本应该是多少?我不确定我的推理是反对将圈复杂度作为度量的效用,还是反对使用虚函数或不同的东西。

编辑:在人们的回应之后,我意识到它不应该增加圈复杂性,因为我们可以认为虚函数调用等同于对包含大量 switch 语句的全局函数的调用。即使该函数会得到一个坏分数,它在程序中只存在一次,而直接用 switch 语句替换每个虚拟函数调用会导致多次成本。

0 投票
4 回答
4341 浏览

c++ - 这种间接函数调用有什么好处?

我在库中找到了以下代码:

现在我想知道:为什么要使用这种间接方式?是否有任何理由说明上述方法比简单的替代方法更好:

0 投票
9 回答
37883 浏览

c++ - 在 C++ 类中使用虚拟方法的性能成本是多少?

在 C++ 类(或其任何父类)中至少有一个虚拟方法意味着该类将有一个虚拟表,并且每个实例都有一个虚拟指针。

所以内存成本是很清楚的。最重要的是实例的内存成本(特别是如果实例很小,例如,如果它们只包含一个整数:在这种情况下,在每个实例中都有一个虚拟指针可能会使实例的大小加倍。至于虚拟表使用的内存空间,我想与实际方法代码使用的空间相比,它通常可以忽略不计。

这让我想到了我的问题:使方法虚拟化是否有可衡量的性能成本(即速度影响)?在运行时,每次方法调用都会在虚拟表中进行查找,所以如果对这个方法的调用非常频繁,并且如果这个方法很短,那么可能会对性能造成可测量的影响?我想这取决于平台,但有人运行过一些基准测试吗?

我问的原因是我遇到了一个错误,该错误恰好是由于程序员忘记定义虚拟方法所致。这不是我第一次看到这种错误。我想:为什么我们在需要时添加virtual 关键字,而不是在绝对确定不需要时删除virtual关键字?如果性能成本低,我想我会在我的团队中简单地推荐以下内容:只需在每个类中默认将每个方法(包括析构函数)设为虚拟,并仅在需要时将其删除。你觉得这听起来很疯狂吗?

0 投票
5 回答
75147 浏览

c++ - 虚拟赋值运算符 C++

C++ 中的赋值运算符可以是虚拟的。为什么需要它?我们可以让其他运营商也虚拟化吗?

0 投票
8 回答
274520 浏览

c++ - 如果我要覆盖它,我可以调用基类的虚函数吗?

假设我有课程FooBar设置如下:

如代码中所述,我希望能够调用我正在覆盖的基类函数。在Java中有super.funcname()语法。这在 C++ 中可能吗?

0 投票
2 回答
582 浏览

c# - 解决虚拟覆盖中的“最衍生”方法

我有一个简单的基类和派生类:

如果我运行这个:

我得到:

但我希望“b.Write(42)”和“d.Write(42)”是相同的。字符串情况也是如此。

我不明白什么?鉴于我无法修改“Base”的约束,我如何才能使行为成为我所期望的?

更新:见埃里克的帖子

0 投票
7 回答
2523 浏览

c++ - 加速 gcc 中的虚函数调用

用 gprof 分析我的 C++ 代码,我发现我的大部分时间都花在了一遍又一遍地调用一个虚拟方法上。该方法本身很短,如果它不是虚拟的,可能会被内联。

有什么方法可以加快速度,而不是将其全部重写为非虚拟的?

0 投票
4 回答
10231 浏览

c++ - 赋值运算符是否适用于不同类型的对象?

对不起。发生了错误。赋值运算符有效吗?或者有什么办法可以做到这一点?[A类和B类之间没有关系。]

非常感谢。

0 投票
23 回答
256896 浏览

c++ - 为什么我们在 C++ 中没有虚拟构造函数?

为什么 C++ 没有虚拟构造函数?