是否存在编译器不会忽略虚方法上的inline关键字的情况?
我正在考虑例如以下案例:
struct Interface
{
virtual void f() = 0;
};
struct Dummy : Interface
{
inline virtual void f() override {}
};
int main()
{
Dummy a;
a.f();
return 0;
}
这样的代码可以优化吗?
答案 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
关键字永远不会被忽略。但是,优化程序始终可以决定函数是内联扩展还是调用。如果在编译时已知运行时类型,则甚至可以内联扩展虚函数调用。
在这种情况下,关键字是多余的,因为在类定义中定义的成员函数无论如何都将隐式内联。
这样的代码可以优化吗?
它可以,因为优化器可以在此上下文中推断出对象的运行时类型。