标签: vtable

什么是C++中的Vtable

可能重复:
为什么我需要虚拟表?

什么是C++中的vtAble?
要知道vtable是一个虚拟表,它有一个指向虚函数的指针数组.是否有一篇实际实施的文章?(任何走过将不胜感激)

c++ vtable

19
推荐指数
2
解决办法
2万
查看次数

Qt:信号和插槽错误:未定义引用`vtable for

以下链接示例:http://developer.kde.org/documentation/books/kde-2.0-development/ch03lev1sec3.html

#include <QObject>
#include <QPushButton>
#include <iostream>
using namespace std;

class MyWindow : public QWidget
{
    Q_OBJECT  // Enable slots and signals
    public:
        MyWindow();
    private slots:
        void slotButton1();
        void slotButton2();
        void slotButtons();
    private:
        QPushButton *button1;
        QPushButton *button2;
};

MyWindow :: MyWindow() : QWidget()
{
    // Create button1 and connect button1->clicked() to this->slotButton1()
    button1 = new QPushButton("Button1", this);
    button1->setGeometry(10,10,100,40);
    button1->show();
    connect(button1, SIGNAL(clicked()), this, SLOT(slotButton1()));

    // Create button2 and connect button2->clicked() to this->slotButton2()
    button2 = new QPushButton("Button2", this);
    button2->setGeometry(110,10,100,40); …
Run Code Online (Sandbox Code Playgroud)

qt vtable signals-slots undefined-reference

19
推荐指数
2
解决办法
4万
查看次数

虚方法表

在讨论密封类时,经常提到术语"虚函数表".究竟是什么?我刚才读到一个方法表(我不记得这个目的的目的)和谷歌/搜索这里带来了C++相关的结果.

谢谢

.net c# virtual vtable

18
推荐指数
2
解决办法
2万
查看次数

C++:类特化是一个符合标准的编译器的有效转换?

希望这对StackOverflow的问题不太专业:如果是,可以在其他地方迁移,请告诉我......

很久以前,我写了一篇本科毕业论文提出了C++和相关语言的各种devirtualization技术,一般是根据代码路径(有点像模板)预编译专业化的想法,但与检查,以选择正确的专长是在情况下,运行时选择它们不能在编译时选择(因为模板必须是).

(非常)基本的想法类似于以下内容...假设你有一个类C如下的类:

class C : public SomeInterface
{
public:
    C(Foo * f) : _f(f) { }

    virtual void quack()
    {
        _f->bark();
    }

    virtual void moo()
    {
        quack(); // a virtual call on this because quack() might be overloaded
    }

    // lots more virtual functions that call virtual functions on *_f or this

private:
    Foo * const _f; // technically doesn't have to be const explicitly
                    // as long as it can be proven not be modified
}; …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction virtual-functions vtable compiler-optimization

18
推荐指数
1
解决办法
379
查看次数

在多重继承中理解vptr?

我试图理解书中有效的c ++语句.以下是多继承的继承图.

在此输入图像描述

在此输入图像描述

现在这本书说vptr需要每个类中的单独内存.它也做了以下声明

上图中的一个奇怪之处在于,即使涉及四个类,也只有三个vptrs.如果愿意,实现可以自由地生成四个vpt,但是三个就足够了(事实证明B和D可以共享一个vptr),并且大多数实现利用这个机会来减少编译器生成的开销.

我看不出有什么理由为什么每个类都要求为vptr提供单独的内存.我理解vptr是从基类继承的,可能是继承类型.如果我们假设它显示了带有继承的vptr的结果内存结构,那么它们如何才能生成该语句

B和D可以共享vptr

有人可以在多重继承中澄清一下vptr吗?

  • 我们每个班级都需要单独的vptr吗?
  • 如果以上是真的,为什么B和D可以共享vptr?

c++ multiple-inheritance virtual-inheritance vtable vptr

17
推荐指数
2
解决办法
5631
查看次数

C中的动态方法调度

我知道这听起来很傻,我知道C不是面向对象的语言.

但有没有办法在C中实现动态方法调度?我考虑过函数指针,但没有得到完整的想法.

我怎么能实现这个?

c oop function-pointers vtable

17
推荐指数
2
解决办法
4710
查看次数

C++编译器可以在同一个指针上优化重复的虚函数调用吗?

假设我有以下代码

void f(PolymorphicType *p)
{
    for (int i = 0; i < 1000; ++i)
    {
        p->virtualMethod(something);
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器生成的代码解除引用pvtable条目是virtualMethod1次还是1000次?我正在使用Microsoft的编译器.

编辑

这是我正在查看的真实世界案例的生成程序集. line->addPoint()是虚拟的关注方法.我没有装配经验,所以我慢慢地过去了...

; 369  :        for (int i = 0; i < numPts; ++i)

    test    ebx, ebx
    je  SHORT $LN1@RDS_SCANNE
    lea edi, DWORD PTR [ecx+32]
    npad    2
$LL3@RDS_SCANNE:

; 370  :        {
; 371  :            double *pts = pPoints[i].SystemXYZ;
; 372  :            line->addPoint(pts[0], pts[1], pts[2]);

    fld QWORD PTR [edi+8]
    mov eax, DWORD PTR …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism performance vtable

15
推荐指数
1
解决办法
1294
查看次数

界面vtable

接口(仅具有纯虚函数的多态类)是否具有vtable?由于接口本身不实现多态函数并且不能直接构造,因此链接器不需要放置vtable.是这样吗?我特别关注MSVC编译器.

c++ polymorphism interface vtable

14
推荐指数
2
解决办法
2851
查看次数

为什么vptr不是静态的?

包含一个或多个虚函数的每个类都有一个与之关联的Vtable.一个名为vptr的void指针指向该vtable.该类的每个对象都包含指向同一Vtable的vptr.那为什么vptr不是静态的呢?而不是将vptr与对象相关联,为什么不将它与类关联?

在此输入图像描述

c++ virtual function vtable vptr

13
推荐指数
2
解决办法
2682
查看次数

使派生的C++类"最终"改变ABI吗?

我很好奇,如果标记现有的派生C++类final以允许去虚拟化优化将在使用C++ 11时改变ABI.我的期望是,它应该有没有影响,因为我认为这主要是提示编译器有关它如何能够优化虚函数,因此我看不到任何方式,它会改变结构或V表的大小,但也许我错过了什么?

我知道这里更改API,以便从这个派生类进一步派生的代码将不再起作用,但我只关注这个特殊情况下的ABI.

c++ virtual-functions abi vtable c++11

13
推荐指数
1
解决办法
479
查看次数