C++通过虚拟机制支持动态绑定。但据我所知,虚拟机制是编译器的实现细节,标准只规定了特定情况下应该发生的行为。大多数编译器都通过虚拟表和虚拟指针来实现虚拟机制。这不涉及虚拟指针和表的实现细节。我的问题是: 是否有任何编译器以除了虚拟指针和虚拟表机制之外的其他方式实现虚拟函数的动态调度?据我...
首先,我想明确一点,我知道C++标准中没有虚函数表和虚函数指针的概念。然而,我认为几乎所有的实现都以非常相似的方式实现了虚函数调用机制(如果我错了,请纠正我,但这不是主要问题)。此外,我相信我知道虚函数如何工作,也就是说,我可以总是知道哪个函数将被调用,我只需要实现细节。 假设有人问我以下问...
我正在尝试理解书中关于Effective C++中的一句话。以下是多重继承的继承图。 现在这本书说每个类都需要单独的内存来存储vptr。此外,它还作出了以下声明: 上面的图表中的奇怪之处在于,即使涉及四个类,也只有三个vptrs。实现可以自由生成四个vptrs(如果他们愿意),但是三个足够...
在Java中:class Base { public Base() { System.out.println("Base::Base()"); virt(); } void virt() { System.out.println("Base::virt()"); } } ...
我最近发布了一个有关C++中虚拟机制导致的内存开销的问题。答案让我明白了虚函数表和虚函数指针是如何工作的。 我的问题是:我在超级计算机上工作,我有数十亿个对象,因此我必须关心由虚拟机制引起的内存开销。经过一些测量,当我使用具有虚函数的类时,每个派生对象都有它的8字节vptr。这绝非微不足道。...
假设我们有以下程序:class A { public: virtual fun(){}; }; class B:public A { public: virtual fun(){}; }; int main() { A a1; B b1...
我看了这个问题:C++虚拟类继承对象大小问题,想知道为什么虚拟继承会导致类中有额外的vtable指针。 我在这里找到一篇文章:https://en.wikipedia.org/wiki/Virtual_inheritance。它告诉我们: 然而,在一般情况下,这个偏移量只有在运行时才...
我在看这篇文章,里面说:“当进入基类析构函数时,对象成为一个基类对象,并且C++中的所有部分——虚函数、dynamic_cast等——都会以这种方式处理它。” 这是否意味着在销毁过程中vptr已经改变了?那是如何发生的呢?
我对vptr和内存中对象的表示有点困惑,希望你能帮助我更好地理解这个问题。 考虑类B继承自A,两个类都定义了虚函数f()。根据我的理解,类B的一个对象在内存中的表示形式如下:[ vptr | A | B ],并且vptr所指向的vtbl包含。我也理解将对象从B转换为A除了忽略对象结尾的B部...