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