【问题标题】:Eigen 3 and overloading the new operator depending on template parameter to ensure proper alignment特征 3 并根据模板参数重载新运算符以确保正确对齐
【发布时间】:2012-09-05 14:38:35
【问题描述】:

我正在使用 Eigen 3.1.1 库和 MS Visual C++ 2010。我想实现一个简单的并发缓冲区来控制对泛型类型 T 元素的访问。

当我使用 Eigen 类型时,如果使用固定大小的可矢量化 Eigen 类型实例化缓冲区,则必须重载并发缓冲区的 new 运算符。也可以看看: 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”中,以便所有派生类都不需要添加特定于特征的实现?

【问题讨论】:

    标签: c++ templates new-operator eigen


    【解决方案1】:

    我看了一眼宏定义,似乎你不需要在你身边做 NeedsToAlign 部分。 Eigen 已经为您做到了。在 Eigen 文档中也说明了只使用宏(那么为什么这不是一个好的解决方案呢?)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      相关资源
      最近更新 更多