C++ 递归静态成员函数与普通成员函数

C++ 递归静态成员函数与普通成员函数,c++,class,recursion,static,member-functions,C++,Class,Recursion,Static,Member Functions,当函数声明为静态成员函数(而不是普通成员函数)时,递归函数是否会更快。例如,类似这样的事情: class Tree { Node* p; public: static int height(Node* n){ ....... int lh = height(n->left); int rh = height(n->right); ...... } }; 可能的原因是什么?从技术角度讲,这是正确的(或者至少可能是正确的*),因为每个

当函数声明为静态成员函数(而不是普通成员函数)时,递归函数是否会更快。例如,类似这样的事情:

class Tree {
  Node* p;
public:
  static int height(Node* n){
     .......
     int lh = height(n->left);
     int rh = height(n->right);
     ......
  }
};

可能的原因是什么?

从技术角度讲,这是正确的(或者至少可能是正确的*),因为每个非静态成员函数调用都包含一个不可见的
参数。例如,如果示例中的
height
函数是非静态的,则其有效签名将是
intheight(Tree*this,Node*n)
。因此,如果您不需要
这个
,您确实会浪费一些非零的循环数来通过它

然而,在实践中,这并不重要(当然,这完全取决于你在做什么)。因此,请编写最有意义的代码,如果探查器显示(a)您有问题,并且(b)优化产生了影响,则只需担心进行微观优化


*我说这可能是真的,因为我怀疑大多数编译器无论如何都会优化掉未使用的参数,但我不是100%确定。

了解这类事情的最好方法是先为自己编写一个测试,然后看看。你真的必须向我们展示你的替代代码是什么。但它不太可能在现代编译器中产生巨大的影响……我并不真正关心速度的差异,但我只是想知道这可能发生的原因。请考虑:<代码> int Head()const {返回p>>Head();},并具有<代码>高度< /Cord>作为(递归)。
节点的成员函数
。如果是内联的,它将被优化掉,但是如果不是内联的,它不会被优化掉(除非编译器能够执行IPO)。原因很简单:在调用站点,编译器不知道函数是否需要
这个
指针。分析这些类型事物的最好方法是简单地查看汇编语言输出。@user3521733但是。。。但是今天是星期五晚上。。。哦;我在跟谁开玩笑。我用VS2013做了这个实验,在内联被抑制的发布模式下,它生成了完全相同的汇编代码,有无
static
。对于调试构建,省略
static
会在调用站点产生额外的
lea
指令,正如人们所期望的那样。所有代码都在一个cpp文件中,这可能是允许进行优化的原因。有趣的是,因为我们没有更好的事情要做,如果您以某种方式发布代码,我将使用g++和clang++进行编译。实际上,现在我想起来了,对象是否有数据成员并不重要,因为在函数内部,它可以引用此
。所以我怀疑它是在做一些IPO。@user3521733这在评论形式上看起来很可怕,但它只是这样:
#include#include class C{public:int a;/*static*/void f();};void C::f(){int C=0;std::cin>>C;}int main(){C C;C.f();}