首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GCC的解虚拟化和内联只有一次接口

GCC的解虚拟化和内联只有一次接口
EN

Stack Overflow用户
提问于 2021-04-22 20:19:29
回答 1查看 79关注 0票数 0

我在以下代码中发现了一个问题:

看来,GCC只能对第一个接口I_Udc进行反虚拟化。接口GCC无法解除第二个接口I_Uac的虚拟化。如果我先写I_Uac,I_Uac调用将是内联的。

以下是编译器资源管理器中的代码:https://godbolt.org/z/z6WEoznfW

代码语言:javascript
运行
复制
class I_Uac
{
    public:
    virtual float GetIUac() = 0;
};

class I_Udc
{
    public:
    virtual float GetIUdc() = 0;

};

class DataAcq final : public I_Udc, public I_Uac
{
    float GetIUac() 
    {
        return r;
    }

    float GetIUdc()
    {
        return m;
    }

    private:
        float r = 20;
        float m = 20;
};

DataAcq temp;

I_Uac& temp1 = temp;
I_Udc& temp2 = temp;


int main ()
{    
    volatile float r = temp1.GetIUac();
    volatile float m = temp2.GetIUdc();
}

所以问题是我如何强制编译器通过接口引用内联这两个函数调用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-23 04:38:36

据我所知,保证去虚拟化的最好的/唯一的方法是从一开始就不虚拟化。对您的类稍作更改就可以使用CRTP方法,尽管它有点丑陋,特别是在引用基类类型时,这是完全可行的。

代码语言:javascript
运行
复制
#include <cstdio>

template <typename DerivedT>
class I_Uac {
public:
    float GetIUac() { 
        return static_cast<DerivedT*>(this)->GetIUac();
    };
};

template <typename DerivedT>
class I_Udc {
    public:
    float GetIUdc() { 
        return static_cast<DerivedT*>(this)->GetIUdc();
    };
};

template <template <typename...> class... BaseTs>
class DataAcq final : public BaseTs<DataAcq<BaseTs...>>... {
public:
    float GetIUac() 
    {
        std::puts("GetIUac"); // much nicer in compiler explorer output
        return r;
    }

    float GetIUdc()
    {
        std::puts("GetIUdc");
        return m;
    }

    private:
        float r = 20;
        float m = 20;
};

DataAcq<I_Udc, I_Uac> temp;
I_Udc<decltype(temp)>& temp1 = temp;
I_Uac<decltype(temp)>& temp2 = temp;

int main ()
{    
    volatile float r = temp1.GetIUdc();
    volatile float m = temp2.GetIUac();
}

https://godbolt.org/z/EMExdoczs

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67213194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档