2

私はちょうどこの質問を読みました、それは私のために別の質問を提起します:

このクラスを検討してください。

class Foo
{
public:
  void setA(int a) { m_a = a; }
  void setB(int b) { m_b = b; }
private:
  int m_a, m_b;
};

これは、「流暢なインターフェース」メソッドを使用して作成することもできます。

class Foo
{
public:
  Foo& setA(int a) { m_a = a; return *this; }
  Foo& setB(int b) { m_b = b; return *this; }
private:
  int m_a, m_b;
};

ここで、次のコードスニペットを作成すると、次のようになります。

int main()
{
  Foo foo;
  foo.setA(1);
  foo.setB(2);
}

returnクラスの2番目の実装を使用した場合、追加のディレクティブによってパフォーマンスに違いが生じますか?

わざわざする必要がありますか?(私の推測は「いいえ」です)

4

6 に答える 6

4

クラスの2番目の実装を使用した場合、追加のreturnディレクティブによってパフォーマンスに違いが生じますか?

わかりませんが、コンパイラとオプティマイザの設定はありますか?あなたが与えた正確なケースでオーバーヘッドが最適化されるのを妨げるものは何もありませんが、このケースを最適化しなかった難解なプラットフォーム用の素朴で次善のコンパイラを書くことを想像できます。

特定の状況で重要だと思われる場合は、を想定する代わりにテストしてください。

于 2011-02-04T16:06:24.717 に答える
0

コンパイラの最適化による違いはないと思います。

于 2011-02-04T15:59:59.353 に答える
0

2番目の実装が使用され、集合関数の戻り値が必要ない場合は、次のように記述する方がよい場合があります。

  (void) foo.setA(1);
  (void) foo.setB(2);

コンパイラーまたは静的アナライザーが戻り値が使用されていないと文句を言わないようにします。

パフォーマンスに関しては、参照を返すと、最初の実装と比較して1つまたは2つの追加のアセンブリ命令が生成される可能性がありますが、「実際の」違いはない可能性があります。

于 2011-02-04T16:07:59.650 に答える
0

メソッドはインライン化されているため、コンパイラーは戻り値が未使用であることを確認し、場合によってはそれを最適化できるはずです。

プロジェクトの設計に最も適した方法を使用してください。次に、パフォーマンスを測定し、それが十分でない場合にのみ、コードの最適化を検討します。

于 2011-02-04T16:08:02.880 に答える
0

クラスを定義した方法では、2つの間に大きな違いはありません(あるとしても)。ただし、デザインを少し修正すると、次のようになります。

class Foo1
{
public:
    Foo1(int a, int b) : m_a(a), m_b(b) {}
    void setA(int a) { m_a = a; }
    void setB(int b) { m_b = b; }
private:
    int m_a, m_b;
};

class Foo2
{
public:
    Foo& setA(int a) { m_a = a;  return *this; }
    Foo& setB(int b) { m_b = b;  return *this; }
private:
    int m_a, m_b;
};

初期化中Foo1

Foo1 f(1, 2); // only constructor called

初期化よりもはるかに効率的ですFoo2

Foo2 b; // constructor called
b.setA(1).setB(2); // 2 functions called

場合によっては、それは問題になりません。

Fluent Interfacesに関する追加の懸念は、エンドユーザーがそれらを誤って使用する能力です。インターフェイスを設計するときは、インターフェイスのユーザーがインターフェイスを壊しにくいように設計する必要があります。すべてのセッターから参照を返すことにより、ユーザーコードがその参照を保存し、オブジェクトが移動または割り当て解除された場合、ぶら下がっている参照があります(そしてそれを認識できない場合もあります)。

于 2011-02-04T16:09:23.153 に答える
0

このようなパフォーマンスの違いは決して重要ではありません。しかし、実際のアプリケーションのいくつかの測定で私が間違っていることを証明してください。

于 2011-02-04T16:23:12.100 に答える