这是对内联函数对象的调用吗?

Fra*_*ank -1 c++ compiler-construction templates inline

在以下代码中,Foo::add通过函数对象调用函数:

struct Plus {
  inline int operator()(int x, int y) const {
    return x + y;
  }
};

template<class Fct>
struct Foo {
  Fct fct;
  Foo(Fct f) : fct(f) {}
  inline int add(int x, int y) {
    return fct(x,y); // same efficiency adding directly?
  }  
};
Run Code Online (Sandbox Code Playgroud)

这与x+y直接调用的效率相同Foo::add吗?换句话说,在fct(x,y)启用优化的情况下编译时,编译器通常直接替换为实际调用,内联代码吗?

AnT*_*AnT 7

嗯,这取决于你的编译器.如果它决定内联,它将内联.如果决定不这样做,它就不会内联.内联由特定于编译器的启发式控制.这取决于编译器.这取决于编译器设置.这取决于具体情况.

唯一可以肯定的方法就是试着看看会发生什么."通常",应该内联.

inline在类定义中定义函数时,PS关键字是冗余的.这些功能已经内联.添加显式inline关键字绝对没有区别.


Mat*_*hen 5

对于g ++ 4.4.1,它将内联到-O1或更高版本.

我使用了程序(以及你的代码):

int main()
{
    Foo<Plus> foo((Plus()));
    int a, b;
    cin >> a >> b;
    int x = foo.add(a, b);
    cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)

对于-O0,你得到(g ++ -S,摘录):

main:
.LFB960:
        ; ...
    call    _ZN3FooI4PlusEC1ES0_
    ; ...
    call    _ZN3FooI4PlusE3addEii
    ; ...

_ZN3FooI4PlusE3addEii:
        ; ...
    call    _ZNK4PlusclEii
        ; ...

ZNK4PlusclEii:
    ; ...
    ; This is the actual add
    leal    (%edx,%eax), %eax
    ; ...
Run Code Online (Sandbox Code Playgroud)

在-O1或-O2时,Foo和Plus完全从该测试中消失.

main:
    ; ...
    addl    24(%esp), %eax
    ; ...
Run Code Online (Sandbox Code Playgroud)