C++ 在类型已知的情况下尝试跳过vtable和inline调用

C++ 在类型已知的情况下尝试跳过vtable和inline调用,c++,gcc,optimization,inline,devirtualization,C++,Gcc,Optimization,Inline,Devirtualization,更新:这似乎是特定于此的 实际结果: 预期结果: 这是一个编译器质量问题。较新版本的(非PowerPC)gcc对此代码没有问题:。如果您想在PowerPC的环境中专门问这个问题,我建议tag.PPC clang似乎也没有问题,因为早在3.4.2:@MaxLanghof似乎不是特定于PPC的,而是由旧的gcc版本引起的,在4.9之前,它在x86中也没有被反虚拟化。可能与之相关。@mbschenkel为什么不将其作为答案发布?:)@麦克斯兰霍夫:不幸的是,我现在必须使用这个编译器,所以它还不能解决

更新:这似乎是特定于此的

实际结果:

预期结果:


这是一个编译器质量问题。较新版本的(非PowerPC)gcc对此代码没有问题:。如果您想在PowerPC的环境中专门问这个问题,我建议tag.PPC clang似乎也没有问题,因为早在3.4.2:@MaxLanghof似乎不是特定于PPC的,而是由旧的gcc版本引起的,在4.9之前,它在x86中也没有被反虚拟化。可能与之相关。@mbschenkel为什么不将其作为答案发布?:)@麦克斯兰霍夫:不幸的是,我现在必须使用这个编译器,所以它还不能解决我的问题,尽管它确实让我更进一步。谢谢
struct Base 
{
    inline virtual void customization(int i) {};
    inline void algorithm(int i) { customization(i); }
};

struct Derived : public Base
{
    // Adding this to every derived class instead of just the base will help, 
    // but is the kind of duplication I would like to avoid:
    // inline void algorithm(int i) { customization(i); }
    inline void customization(int i) override final { helper(i) };
};

void my_main()
{
    // Note that these are concrete instances, not references ..
    Derived d1, d2; 
    d1.algorithm(111);
    d2.algorithm(222);

    // ... which could just be optimized into the following, ...
    helper(111);
    helper(222);

    // ... but instead vtable calls to Base::algorithms result, behaving just as if it was
    static_cast<Base&>(d1).algorithm(111);
    static_cast<Base&>(d2).algorithm(222);
}