【发布时间】:2021-04-22 12:19:29
【问题描述】:
我发现以下代码有问题:
看起来 GCC 只能去虚拟化第一个接口 I_Udc。 Interface GCC 不能去虚拟化第二个接口 I_Uac。如果我先写 I_Uac,I_Uac 调用会被内联。
这是编译器资源管理器中的代码: https://godbolt.org/z/z6WEoznfW
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();
}
所以问题是如何强制编译器通过接口引用内联两个函数调用?
【问题讨论】:
-
为什么是循环?你让编译器哭了......
-
"调用非虚拟 thunk 到 DataAcq::GetIUac()"。似乎去虚拟化了,但没有内联。
-
@Jarod42 是的,抱歉我的意思是内联
-
如果你使用 gcc master(在 Godbolt 上称为 trunk),它会内联。
标签: c++ gcc devirtualization