2010-05-01 75 views
6

我想知道当存在非静态成员函数时是否有任何优势使用静态成员函数。它会导致更快的执行(因为不必关心所有的成员变量),或者更少的内存使用(因为没有被包含在所有实例中)?使用静态成员函数而不是等效的非静态成员函数的优点?

基本上,我正在看的函数是一个效用函数,用于将表示像素颜色的整数数组围绕任意中心点旋转任意数量。它被放置在我的抽象Bullet基类中,因为只有子弹才会使用它,而且我不想在某些实用程序类中调用它的开销。它有点太长,并且在每个派生的子弹类中都会使用,所以内联可能不是个好主意。你会如何建议我定义这个功能?作为Bullet的静态成员函数,Bullet的非静态成员函数,或者不是Bullet的成员,而是在Bullet.h中类的外部定义的成员?每个的优点和缺点是什么?

回答

9

静态成员函数和自由函数之间绝对没有性能差异。

从设计的角度来看,这听起来像是有问题的函数与Bullets很少有关系,所以我倾向于将它放在实用程序库的某个地方,这样做没有运行时间开销,只有额外的开发人员努力你还没有这样的图书馆。

关于原始问题,如果函数不明显属于某个特定的类,那么它应该是一个自由函数。最多只能属于一个命名空间,以控制其范围。即使它属于一个类,大多数时候,我仍然更喜欢自由函数,除非函数需要访问私有成员。

+0

是的,我不太确定C++是如何工作的。我来自Flash背景,ActionScript在最奇怪的地方有可怕的开销 - 实用程序类中的静态函数在运行时解析,所以每次使用Math.sin时,都必须通过哈希表找到Math类,然后找到sin函数。很高兴听到C++至少有更多的常识.. – jonathanasdf 2010-05-01 05:24:17

+3

@Zan:静态成员函数没有'this'指针。 – 2010-05-01 05:37:33

+0

确实,你是对的。我读到我回应的这句话:“成员函数和免费函数之间绝对没有性能差异”。这实际上并不是它所说的。我的错。 – 2010-05-02 01:53:24

1

如果该方法需要在类名称空间中,但不在该类的实例上运行(即,它不使用this也不使用任何非静态方法),则应将其声明为static

当我有一个跟踪其实例的类时,我多次使用静态方法。它使用双链表,插入构造函数,并且析构函数从列表中删除对象。对象本身具有前一个和下一个指针作为成员,第一个和最后一个指针是静态成员,而所有这些指针都是私有的。所有在列表上工作的方法,例如搜索或计数,是静态方法。

3

如果可能的话,通常使用static,以消除对象的需要并消除无关的参数this参数。

但是一个例外是仿函数:定义operator()的类,因此可以将“对象”称为函数。在class {}区块内部在inline的地方声明了这样的operator()

然后,如果函数很小,它会被内联到调用函数中,并且指针会被优化。

如果功能很大,可能不会内联。但是,有一个额外的论点的微不足道的可能无论如何可能是矮小的。