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 文档中也说明了仅使用宏(那么为什么这不是一个好的解决方案?)。

关于你的第二个问题:操作员 new 将在没有虚拟的情况下声明,所以我想(!)它不会工作。

于 2012-09-05T15:19:30.627 回答