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++コーディング標準から引用された質問の2番目の部分に焦点を当てています
:101ルール、ガイドライン、およびベストプラクティス:

Chapter 44. 非メンバ非フレンド関数の記述を好む
[...] 非メンバ非フレンド関数は、依存関係を最小限に抑えることでカプセル化を改善する [...]

Scott Meyers は、どのメソッドがクラスのメンバーであるべきかを決定するための次のアルゴリズムを提案しています ( source )

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 を非静的にする唯一の理由は、オーバーロードする場合ですが、仮想ではないため、これは機能しません。

于 2012-08-07T18:49:15.930 に答える
0

どちらの関数もデータ メンバーにアクセスせず、仮想的なものから派生していないため、おそらく違いはありません。

しかし、一般的なケースでは、メンバー関数としての「foo」は通常、追加の引数「this」を渡して使用する必要があるため、「bar」は非常に高速です。

于 2012-08-07T18:49:09.303 に答える