2012-09-05 7 views
1

我正在使用Eigen 3.1.1庫和MS Visual C++ 2010.我想實現一個簡單的併發緩衝區來控制對一個元素的訪問通用類型T.Eigen 3並根據模板參數重載新運算符以確保正確對齊

由於我使用Eigen類型,因此如果使用固定大小的可矢量化Eigen類型實例化緩衝區,則必須重載併發緩衝區的新運算符。另見: Structures Having Eigen Members

#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」中,以便所有派生類不需要添加特定於本地的實現?

回答

1

我瞥了一下宏定義,看起來,你不需要在你身邊做NeedsToAlign部分。 Eigen已經在爲你做。在Eigen文檔中也聲明只使用宏(所以爲什麼這不是一個好的解決方案?)。

關於你的第二個問題:operator new將被聲明爲沒有virtual,所以我想(!)它不起作用。