1

Eigen 3.1.1 ライブラリと MS Visual C++ 2010 を使用しています。ジェネリック型 T の要素へのアクセスを制御する単純な同時実行バッファを実装したいと考えています。

私は Eigen 型を扱っているので、バッファーが固定サイズのベクトル化可能な Eigen 型でインスタンス化されている場合、並行バッファーの new 演算子をオーバーロードする必要があります。参照: 固有メンバーを持つ構造体.

#include <boost/thread.hpp>
#include <Eigen/Geometry>   // required for the eigen macro

// abstract base class for all buffers
template <class T>
class ConcurrentBuffer
{
public:
    // virtual destructor to allow subclassing
    virtual ~ConcurrentBuffer(){}

    //virtual void get(T& elem) = 0;
    //virtual void put(const T& elem) = 0;
};


template<class T>
class SingleElementStorage : public ConcurrentBuffer<T>
{
public:
    // For fixed-size vect. Eigen types:
    typedef T Elem_type;
    enum { NeedsToAlign = (sizeof(Elem_type)%16)==0 };
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)


    SingleElementStorage() {}
    ~SingleElementStorage() {}

    //void get(T& elem);
    //void put(const T& elem);

private:
    T elem_;
    boost::shared_mutex mutex_;
};

このコードは、MSVC++ で正常にコンパイルされます。私の質問は、これがそのようなバッファーを実現するための最良の方法であるかどうかです。実際、このコードは、EIGEN_MAKE_ALIGNED_OPERATOR_NEW のみが使用され、typedef と enum が削除された場合にもコンパイルされます。

では、プロジェクトのすべての構造体/クラスに単純に EIGEN_MAKE_ALIGNED_OPERATOR_NEW を入れるべきではないのはなぜですか?

別の関連する質問: すべての派生クラスが固有固有の実装を追加する必要がないように、マクロを抽象基本クラス「ConcurrentBuffer」に入れることは何とか可能ですか?

4

1 に答える 1

1

マクロ定義をちらりと見たところ、自分の側で NeedsToAlign 部分を実行する必要がないようです。Eigen はすでにそれを行っています。Eigen のドキュメントには、マクロを単独で使用することも記載されています (では、なぜこれが良い解決策ではないのでしょうか?)。

2 番目の質問について: 演算子 new は virtual なしで宣言されるため、(!) 動作しないと思います。

于 2012-09-05T15:19:30.627 に答える