问题标签 [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.
c++ - 何时在 C++ 中创建 vtable?
编译器究竟什么时候创建虚函数表?
1) 当类包含至少一个虚函数时。
或者
2) 当直接基类包含至少一个虚函数时。
或者
3)当层次结构中任何级别的任何父类包含至少一个虚函数时。
与此相关的一个问题:是否可以在 C++ 层次结构中放弃动态调度?
例如考虑下面的例子。
哪些类将包含 V-Table?
既然 B 没有将 f() 声明为虚拟,那么 C 类会获得动态多态性吗?
c++ - 虚拟方法混乱,我怎样才能找到导致它的原因?
我的一位同事今天遇到了一些 C++ 代码的问题。他正在调试对象虚方法的怪异行为。每当执行该方法时(在调试下,Visual Studio 2005 下),一切都出错了,调试器不会进入该方法,而是进入对象的析构函数!另外,对象的虚拟表,只列出了它的析构函数,没有其他方法。
我以前从未见过这种行为,并且打印了运行时错误,说明了有关ESP
寄存器的内容。我希望我能给你正确的错误信息,但我现在记不正确了。
无论如何,你们有没有遇到过这种情况?什么可能导致这种行为?那将如何解决?我们多次尝试重建项目,重新启动 IDE,没有任何帮助。我们还在_CrtCheckMemory
该方法调用之前使用该函数来确保内存处于良好状态,并且它返回true
(这意味着 ok )。我没有更多的想法了。你?
c++ - 使用虚拟方法的 C++ 对象大小
我对虚拟对象的大小有一些疑问。
1)虚函数
A 类的大小是 8 字节......一个整数(4 字节)加上一个虚拟指针(4 字节) 很清楚!
B类的大小是多少?我使用 sizeof B 测试,它打印 12
这是否意味着即使B类和A类都具有虚功能,也只有一个vptr?为什么只有一个 vptr?
C的大小是20......
看来在这种情况下,布局中有两个vptr......这是怎么回事?我认为这两个 vptr 一个用于 A 类,另一个用于 B 类....所以 C 类的虚函数没有 vptr?
我的问题是,关于继承中 vptr 数量的规则是什么?
2) 虚拟继承
A 的大小为 8 个字节 -------------- 4(int a) + 4 (vptr) = 8
B的大小是16字节-------------- 没有虚拟应该是4 + 4 + 4 = 12。为什么这里还有4个字节?B类的布局是什么?
C 的大小为 12 个字节。-------------- 4 + 4 + 4 = 12。很明显!
D 的大小是 32 字节 -------------- 应该是 16(B 类) + 12(C 类) + 4(int d) = 32。对吗?
A 的大小为 8
B 的大小为 16
C 的大小为 16
sizeof D 为 28 是否意味着 28 = 16(B 类) + 16(C 类) - 8(A 类) + 4 (这是什么?)
我的问题是,为什么应用虚拟继承时会有额外的空间?
在这种情况下,对象大小的基本规则是什么?
将 virtual 应用于所有基类和部分基类有什么区别?
c++ - Virtual tables on anonymous classes
I have something similar to this in my code:
I'd expect this to give this output:
and it does so, when compiled under GCC (3.4.5 I believe).
Compiling and running this under Visual Studio 2008 however, gives this:
What is interesting, is that if I give the Base-derived structs names (struct s1 : public Base
), it works correctly.
Which behavior, if any, is correct? Is VS just being prissy, or is it adhering to the standard? Am I missing something vital here?
c++ - 子类中未调用 C++ 虚函数
考虑这个简单的情况:
换句话说:
- A 是一个纯虚类。
- B 是一个没有超类和一个非纯虚函数的类。
- C 是 A 和 B 的子类,并覆盖 A 的纯虚函数。
令我惊讶的是第一个输出,即
虽然我在代码中调用了 a(),但调用了 b()。我的猜测是,这与变量 b 是指向 B 类的指针有关,而 B 类不是 A 类的子类。但运行时类型仍然是指向 C 实例的指针。
从 Java 的角度来看,解释这个奇怪行为的确切 C++ 规则是什么?
c# - 哪个更快,带锁的函数调用或虚拟调用?
我有一个当前不需要线程安全的类,但将来我们可能想要制作一个线程安全的版本。在我看来,我现在可以通过在相关函数周围加锁来使其成为线程安全的,或者我现在可以使它们成为虚拟的,然后在后代类的覆盖中加锁。也就是说,今天我可以这样做:
或者我可以这样做:
今天,哪个选项可以更快地完成工作?
c++ - 内联虚函数
在 C++ 中,我的理解是可以内联虚函数,但通常会忽略内联的提示。似乎内联虚函数没有太大意义。
是对的吗?
任何人都可以给出一个内联虚函数好的例子吗?
c++ - 您可以在 C++ 中缓存虚函数查找吗?
假设我在抽象基类指针 mypointer->foo() 上有一个虚函数调用 foo()。当我的应用程序启动时,根据文件的内容,它选择实例化一个特定的具体类并将 mypointer 分配给该实例。在应用程序的余生中,mypointer 将始终指向该具体类型的对象。我无法知道这个具体类型是什么(它可能由动态加载库中的工厂实例化)。我只知道在第一次创建具体类型的实例后类型将保持不变。指针可能并不总是指向同一个对象,但该对象总是具有相同的具体类型。请注意,类型在技术上是在“运行时”确定的,因为它基于文件的内容,但在“启动”(加载文件)之后,类型是固定的。
但是,在 C++ 中,每次在应用程序的整个持续时间内调用 foo 时,我都会支付虚函数查找成本。编译器无法优化查找,因为它无法知道具体类型在运行时不会发生变化(即使它是有史以来最神奇的编译器,它也无法推测动态加载的行为图书馆)。在 Java 或 .NET 等 JIT 编译语言中,JIT 可以检测到重复使用相同的类型并进行内联缓存。我基本上是在寻找一种方法来手动为 C++ 中的特定指针执行此操作。
C++ 中有什么方法可以缓存这个查找吗?我意识到解决方案可能非常骇人听闻。如果可以编写配置测试来发现 ABI/编译器的相关方面,那么我愿意接受 ABI/编译器特定的 hack,即使它不是真正可移植的,它也是“实际上可移植的”。
更新:对于反对者:如果这不值得优化,那么我怀疑现代 JIT 会这样做。您是否认为 Sun 和 MS 的工程师正在浪费时间实施内联缓存,并且没有对其进行基准测试以确保有改进?
c++ - 从两个多态类继承
给定以下代码
我得到了我期望的输出
但是,如果我将定义更改U
为
我仍然可以正常编译并且没有警告/错误,但现在是输出
阻止我调用的虚拟声明是foo
什么?
c++ - C++ 虚函数调用与 boost::function 快速调用
我想知道与一个相同的 boost::function 调用相比,单继承虚函数调用有多快。它们的性能几乎相同还是 boost::function 更慢?
我知道性能可能因情况而异,但是,作为一般规则,哪个更快,在多大程度上是这样?
谢谢,吉尔赫姆
- 编辑
KennyTM 的测试足以让我信服。对于我自己的目的, boost::function 似乎并不比 vcall 慢得多。谢谢。