在以下代码中,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)
,内联代码?
答案 0 :(得分:7)
嗯,这取决于你的编译器。如果它决定内联,它将内联。如果决定不这样做,它就不会内联。内联由特定于编译器的启发式控制。这取决于编译器。这取决于编译器设置。这取决于具体情况。
唯一可以肯定的方法是尝试看看会发生什么。 “通常”,应该内联。
P.S。在类定义中定义函数时,关键字inline
是多余的。这些功能已经内联。添加显式inline
关键字绝对没有区别。
答案 1 :(得分: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
; ...