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

问题描述 投票:0回答:2

在下面的代码中,

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?
  }  
};

这和在

x+y
中直接调用
Foo::add
是一样的效率吗?换句话说,在启用优化的情况下进行编译时,编译器通常是否直接将
fct(x,y)
替换为实际调用,内联代码?

c++ templates optimization inline
2个回答
7
投票

嗯,这取决于你的编译器。如果它决定内联,它就会内联。如果决定不这样做,它就不会内联。内联由编译器特定的启发式控制。这取决于编译器。这取决于编译器设置。这取决于上下文。

唯一能确定的方法就是尝试看看会发生什么。 “通常”,它应该是内联的。

附注当函数在类定义中定义时,关键字

inline
是多余的。这些函数已经是内联的。添加明确的
inline
关键字绝对没有区别。


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;
}

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

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

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

ZNK4PlusclEii:
    ; ...
    ; This is the actual add
    leal    (%edx,%eax), %eax
    ; ...

在 -O1 或 -O2 处,Foo 和 Plus 从此测试中完全消失。

main:
    ; ...
    addl    24(%esp), %eax
    ; ...
© www.soinside.com 2019 - 2024. All rights reserved.