6

在 C++ 类中,使用静态函数而不是成员函数是否有任何开销。

class CExample
{
    public: 
        int foo( int a, int b) {
            return a + b ; 
        }
        static int bar( int a, int b) {
            return a + b ; 
        } 
};

我的问题是;

  • 在这个例子中是 foo() 还是 bar() 更有效?
  • 为什么我不想将 foo() 放入静态函数,因为它不会改变任何成员变量?
4

4 回答 4

10

在这个例子中是 foo() 还是 bar() 更有效?

不,这两个调用都是静态解决的。this将指针传递给非函数可能会有一些开销static,但在这种情况下,两者都可能被内联。

为什么我不想将 foo() 放入静态函数,因为它不会改变任何成员变量?

你不会,让所有方法不绑定到一个实例实际上是一个好习惯static

于 2012-08-07T18:48:29.847 回答
5

此答案重点解决您的问题的第二部分,
引自 C++ 编码标准:101 条规则、指南和最佳实践:

第 44 章。更喜欢编写非成员非友元函数
[...] 非成员非友元函数通过最小化依赖关系来改进封装 [...]

Scott Meyers 提出了以下算法,用于确定哪些方法应该是类的成员(来源

if (f needs to be virtual)
   make f a member function of C;
else if (f is operator>> or operator<<)
   {
   make f a non-member function;
   if (f needs access to non-public members of C)
      make f a friend of C;
   }
else if (f needs type conversions on its left-most argument)
   {
   make f a non-member function;
   if (f needs access to non-public members of C)
      make f a friend of C;
   }
else if (f can be implemented via C's public interface)
   make f a non-member function;
else
   make f a member function of C;

至于你问题的前半部分,我猜编译器会优化任何差异。

于 2012-08-07T18:58:43.380 回答
1

bar 在某些编译器/情况下的开销可能较小,因为它永远不需要放在指针表中,也不需要额外的“this”参数。

如果 foo 不使用本地成员,则使 foo 成为非静态的唯一原因是您打算重载它,但由于它不是虚拟的,因此不会起作用。

于 2012-08-07T18:49:15.930 回答
0

可能没有区别,因为这两个函数都不会访问数据成员,而且您也不是从任何虚拟的东西中派生出来的。

但在一般情况下,“bar”会无限快,因为“foo”作为成员函数通常必须传递并使用附加参数 - “this”

于 2012-08-07T18:49:09.303 回答