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

C++ 虚拟方法上的内联总是无用的吗?,c++,inline,virtual-functions,C++,Inline,Virtual Functions,是否存在编译器不忽略虚拟方法上的内联关键字的情况 例如,我想到以下情况: struct Interface { virtual void f() = 0; }; struct Dummy : Interface { inline virtual void f() override {} }; int main() { Dummy a; a.f(); return 0; } 这样的代码可以优化吗?阅读上的Wiki页面。有些可能会这样做(最近有一些

是否存在编译器不忽略虚拟方法上的内联关键字的情况

例如,我想到以下情况:

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

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

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

    return 0;  
}
这样的代码可以优化吗?

阅读上的Wiki页面。有些可能会这样做(最近有一些优化过程可以这样做)

顺便说一句,使用gcc5.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;}
(顺便说一句,在
接口中添加
int foo;
字段和构造函数&析构函数设置,它不会更改优化后的
main

是否存在编译器不忽略虚拟方法上的内联关键字的情况

inline
关键字永远不会被忽略。然而,总是由优化器决定是内联扩展还是调用函数。如果运行时类型在编译时已知,则即使虚拟函数调用也可以内联扩展

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

这样的代码可以优化吗


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

内联定义的成员函数是隐式
内联的
。令人困惑的是,内联
关键字
并没有提示编译器代码应该内联。这是一种常见的误解。它只告诉编译器函数体的定义可能出现多次(只要每个副本完全相同)。当在类声明中定义成员函数时,以及当扩展模板函数(任何类型)和模板类的成员时,内联是隐式的。@RichardHodges说得很迂腐,标准也不同意您的第一句话<代码>[dcl.fct.spec]/2。。。内联说明符向实现表明,在调用点对函数体进行内联替换比通常的函数调用机制更可取。
但当然,认为这只是一个提示是不正确的,因为您所说的内联函数可以被多次定义(在单独的翻译单元中)是正确的。@user207933计算机科学中的学究作风是一种美德。我的观点是正确的。:/afaik
inline
关键字只是对编译器的提示,可以ignored@tobi303这确实是对编译器的一个提示,内联扩展比函数调用更可取,并且该提示确实可以忽略。但是内联不仅仅是一个提示。应在使用odr的每个翻译单元中定义内联函数。与非内联函数不同,非内联函数不应在多个翻译单元中定义。编译器不能忽略该规则。