gpt4 book ai didi

c++ - 获取指向虚方法的指针?

转载 作者:搜寻专家 更新时间:2023-10-31 00:18:14 24 4
gpt4 key购买 nike

我有一个函数需要在一个循环中多次调用虚方法,我希望有一种方法可以避免每次都进行 vtable 查找的开销。我想也许获得指向该方法的指针是解决这个问题的好方法。下面的代码显示了我正在尝试做的事情,问题是 Derived 中方法的地址不能分配给 Base 成员函数指针。

class Base
{
public:

typedef float ( Base::*MFP )( float const & x ) const;

virtual MFP getMFP( void ) const = 0;

virtual float function( float const & x ) const = 0;
};

class Derived : public Base
{
public:

virtual MFP getMFP( void ) const
{
return &Derived::function;
}

virtual float function( float const & x ) const
{
return x * x;
}
};

class Other
{
public:

float calculate( float const & x, Base * pBase ) const
{
Base::MFP function = pBase->getMFP();
return ( ( *pBase ).*( function ) )( x );
}
};

有没有办法做我想在这里做的事情?


编辑:

对于仍然感兴趣的人,我对我的代码进行了定时测试。事实证明,动态调度只使我的计算方法减慢了 0.004%,几乎没有。使用完全优化的 MSVC 2010 编译。

最佳答案

您的想法基于错误的假设,即创建此类指针将使 VMT 访问脱离循环(即执行一次而不是在循环中重复执行)。

在 C++ 语言中,通过“指向成员函数的指针”类型的指针(碰巧绑定(bind)到一个虚拟成员函数)的调用总是在调用时被解析 ,不是在初始化的时候。这意味着即使你创建了这样一个指针,它也不会优化任何东西。 循环中的每个调用仍将执行对 VMT 的全面访问,就像没有任何指针一样。

在 C++ 中,无法在初始化时强制此类指针指向虚函数的特定 版本。 C++ 语言根本没有这样的特性。

关于c++ - 获取指向虚方法的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11214973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com