内联虚拟方法总是无用的吗?

时间:2015-12-16 10:07:31

标签: c++ inline virtual-method

是否存在编译器不会忽略虚方法上的inline关键字的情况?

我正在考虑例如以下案例:

struct Interface
{
    virtual void f() = 0;
};

struct Dummy : Interface
{
    inline virtual void f() override {}
};

int main()
{
    Dummy a;
    a.f();

    return 0;  
}

这样的代码可以优化吗?

2 个答案:

答案 0 :(得分:3)

阅读virtual method table上的wikipage。有些optimizing compilers可能会执行一些devirtualization(最近GCC有一些优化过程可以做到这一点。)

BTW,编译你的例子,使用GCC 5.3(在Linux / Debian / Sid / x86_64上),g++ -std=c++11 -Wall -fverbose-asm -S -O2;你看到main被编译成:

    .type   main, @function
 main:
.LFB1:
    .file 1 "ex.cc"
    .loc 1 12 0
    .cfi_startproc
 .LVL0:
    .loc 1 17 0
    xorl    %eax, %eax      #
    ret
    .cfi_endproc

所以你的程序被优化为等同于int main() {return 0;}(BTW,在int foo;中添加Interface字段以及构造函数和析构函数设置它不会更改生成的优化{{ 1}})

答案 1 :(得分:0)

  

是否存在编译器不会忽略虚方法上的inline关键字的情况?

inline关键字永远不会被忽略。但是,优化程序始终可以决定函数是内联扩展还是调用。如果在编译时已知运行时类型,则甚至可以内联扩展虚函数调用。

在这种情况下,关键字是多余的,因为在类定义中定义的成员函数无论如何都将隐式内联。

  

这样的代码可以优化吗?

它可以,因为优化器可以在此上下文中推断出对象的运行时类型。