C++ 与普通函数相比,使用静态成员函数是否有任何开销?
我使用模板类来生成函数。所以我决定在类中定义函数C++ 与普通函数相比,使用静态成员函数是否有任何开销?,c++,function,c++11,static,C++,Function,C++11,Static,我使用模板类来生成函数。所以我决定在类中定义函数 template<class T> struct A { static T F(){} static T F1(){} }; 模板 结构A { 静态tf(){} 静态T F1(){} }; 结构中没有我需要使用的变量。我使用A::F()调用函数。时间对我的工作非常重要(甚至是纳秒)。转换为简单的模板函数(未在类或结构中定义)有什么好处吗?简而言之 不,在运行时不会为模板函数调用或静态成员函数调用生成开销。所以说吧。
template<class T>
struct A
{
static T F(){}
static T F1(){}
};
模板
结构A
{
静态tf(){}
静态T F1(){}
};
结构中没有我需要使用的变量。我使用A::F()
调用函数。时间对我的工作非常重要(甚至是纳秒)。转换为简单的模板函数(未在类或结构中定义)有什么好处吗?简而言之
不,在运行时不会为模板函数调用或静态成员函数调用生成开销。所以说吧。如果你的档案员告诉你一些事情,你当然会带着另一个问题回来:-)
更多细节
模板是编译时业务。因此,对模板化函数的调用不会因为模板替换而在运行时给您带来开销。它的性能与您自己重写函数以替换源代码中的类型相同(但后者将非常麻烦)
例如:
template <class T>
void f(T& a, T*p)
{ a = *p; }
void fi(int& a, int*p)
{ a = *p; }
int test (int& x) {
fi(x, pi); // or f(x, pi);
}
静态函数本身也不会引入任何运行时开销。静态函数调用甚至可能比非静态成员函数更快,因为调用普通成员函数时,需要在幕后做一些额外的工作,以确保函数知道调用它的对象
例如:
struct A {
static int fs();
int fns();
};
extern A a;
int test (int& x) {
A::fs();
a.fns();
}
这次生成了以下代码:
test(int&):
sub rsp, 8
call A::fs() ; static call is just a call in assembler
mov edi, OFFSET FLAT:a ; non-static needs to pass object's address
call A::fns() ; before the call can be made
您是否实际测量了硬件与工作负载之间的差异?
test(int&):
sub rsp, 8
call A::fs() ; static call is just a call in assembler
mov edi, OFFSET FLAT:a ; non-static needs to pass object's address
call A::fns() ; before the call can be made