gpt4 book ai didi

c++ - Eigen 3 并根据模板参数重载新运算符以确保正确对齐

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:39 25 4
gpt4 key购买 nike

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

当我使用 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 和枚举,此代码也可以编译。

那么为什么我不应该简单地将 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 放入我项目的每个结构/类中?

另一个相关问题:是否有可能以某种方式将宏放入抽象基类“ConcurrentBuffer”中,以便所有派生类都不需要添加特征特定的实现?

最佳答案

我看了一眼宏定义,似乎您不需要自己做 NeedsToAlign 部分。 Eigen 已经为您完成了。 Eigen 文档中还说明仅单独使用宏(那么为什么这不是一个好的解决方案?)。

关于你的第二个问题:operator new 将在没有 virtual 的情况下声明,所以我想(!)它不会起作用。

关于c++ - Eigen 3 并根据模板参数重载新运算符以确保正确对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12283953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com