2

'vertex'という名前のクラスの2つのバージョンがあり、1つは座標に直接アクセサーを使用します。

struct vertex
{
    // Coordinates
    std::array<double, 3> coords;

    // Direct accessors
    double & x;
    double & y;
    double & z;

    // Constructor
    template<typename... T> vertex(T &&... coordinates) :
        coords{{ std::forward<T>(coordinates)... }},
        x( coords[0] ), y( coords[1] ), z( coords[2] )
    { }
};

およびアクセス機能を使用するその他:

struct vertex
{
    // Coordinates
    std::array<double, 3> coords;

    // Access functions
    double & x() { return coords[0]; }
    double & y() { return coords[1]; }
    double & z() { return coords[2]; }

    // Constructor
    template<typename... T> vertex(T &&... coordinates) :
        coords{{ std::forward<T>(coordinates)... }}
    { }
};

この特定のケースにはどちらのアプローチが適していますか?他の提案をいただければ幸いです。ありがとう!

4

6 に答える 6

2

ゲッターの方がいいと思います。最初のアプローチでは、実際のメリットがないため、より大きなサイズのオブジェクトが作成されます。

于 2012-08-09T18:12:10.637 に答える
2

私は通常、カプセル化の目的で関数を実行します。

ただし、頂点を処理しているため、これは非常に特殊なケースです。これらのオブジェクトの多くを操作することを計画している場合(メッシュのレンダリングまたは変換)、直接アクセスにはパフォーマンスの点でいくつかの利点があります。

一部のグラフィックライブラリは、効率が必須であるリアルタイム環境でのベクターのような操作に直接アクセスを使用します(一部の本も示唆しています)。

たとえば、 Ogre::Vector3を見てください。

それにもかかわらず、私はあなたが最初の解決策でしていることをしません。他の人が言ったように、あなたは理由もなく(最終的には多くの頂点のために)使用済みスペースを2倍にしている。私の観点からすると、高性能のコンテキストでは、これが最良の頂点になる可能性があります。

class Vertex
{
public:
   double X;
   double Y;
   double Z;
};
于 2012-08-09T18:14:17.313 に答える
1

私はこの機能を使います-それはあなたが将来あなたの心をより簡単に変えることを可能にします。さらに、これを行うことはできません:

double & x() { return coords[0]; }
double & y() { return coords[1]; }
double & z() { return coords[2]; }

double x() const { return coords[0]; }
double y() const { return coords[1]; }
double z() const { return coords[2]; }

アクセサーと。

于 2012-08-09T18:10:13.230 に答える
1

まあ、私はいくつかの理由で最初のものがより良いと思います:

  • 頂点座標で追加の処理mid-getまたはmid-setを実行する可能性はほとんどありません。
  • 頂点の操作は通常ループで非常に頻繁に行われ、頂点はレンダリングに関連していることが多いため、最初のオプション(直接アクセス)を使用するとパフォーマンスが向上する可能性があります。
  • 簡単なゲッターとセッターを使用してメンバーに直接アクセスする場合は、カプセル化は必須ではありません。それは教義による単なるオブジェクト指向です。

そうは言っても、2番目のアプローチには、変更に対してより回復力のある不変のインターフェースなどの利点もあります。私はまだ最初のものに固執します。

于 2012-08-09T18:14:49.513 に答える
0

メンバーへの直接書き込みアクセスが本当に必要な場合(この場合は適切であると思われます、インライン関数をお勧めします。これにより、将来、必要に応じて、プロファイルを作成し、アクセスに追加の機能を注入する柔軟性が得られます。

于 2012-08-09T18:10:58.543 に答える
0

最善の解決策は、2番目のオプションの参照を削除してセッターを追加することだと思います。しかし、これらが唯一の選択肢である場合、2番目の方がわずかに優れています。

于 2012-08-09T18:11:45.410 に答える