我已经阅读了关于C++ 11中移动语义的一些描述,我想知道它可以在什么上下文中使用.目前,许多C++数学库使用模板元编程来延迟评估.
如果M = A + B + C*D,其中M,A,B,C和D是矩阵,则模板元编程允许避免无用的副本.移动语义是一种更方便的方式来做这些事吗?
如果不是,则在什么上下文中使用移动语义.如果是,与模板元编程相比,这种用途有什么区别/限制?
我想在我的程序中使用Eigen矩阵库作为线性代数引擎.Eigen使用表达式模板来实现延迟评估并简化循环和计算.
例如:
#include<Eigen/Core>
int main()
{
int size = 40;
// VectorXf is a vector of floats, with dynamic size.
Eigen::VectorXf u(size), v(size), w(size), z(size);
u = 2*v + w + 0.2*z;
}
Run Code Online (Sandbox Code Playgroud)
由于Eigen使用表达式模板,代码如
u = 2*v + w + 0.2*z;
Run Code Online (Sandbox Code Playgroud)
在上面提到的样品中,减少到长度为10的单个环(不是40,浮子被4个块放入调节器中)而不会产生临时的.多么酷啊?
但如果我像这样集成库:
class UsingEigen
{
public:
UsingEigen(const Eigen::VectorXf& data):
data_(data)
{}
UsingEigen operator + (const UsingEigen& adee)const
{
return UsingEigen(data_ + adee.data_);
}
...
private:
Eigen::VectorXf data_;
}
Run Code Online (Sandbox Code Playgroud)
那么表达式就像:
UsingEigen a, b, c, d;
a = b + c …Run Code Online (Sandbox Code Playgroud) 我正在开发一个C++库,用户将提供复杂的输入,例如矩阵和四元数.我不想重新实现这些类型,因此,在内部,我将使用Eigen库.
我正在尝试确定将这些类型公开给我的库客户端的最佳方法,并为我的API提供了一些选项.我使用四元数类型作为示例,但这可以同样适用于矩阵等.此外,虽然我特别谈到暴露Eigen的类型,但我想这个问题同样适用于其他使用的外部库.
1)仅使用基本的C++类型
此选项将要求客户端通过基本类型传递数据.例如,对于传入四元数(4个元素),可以执行以下操作:
void my_func(double my_quat[4])
Run Code Online (Sandbox Code Playgroud)
2)暴露本征的类型
Eigen为数组和四元数提供了几种模板化类型.例如,如果一个函数需要一个四元数,我可以使用Eigen的Quaterniond
类型(它实际上是一个typedef Quaternion<double>):
void my_func(const Eigen::Quaterniond& my_quat)
Run Code Online (Sandbox Code Playgroud)
3)为客户端的各种类型创建一个简单的包装器
我可以创建一个非常简单的四元数类型(比方说,某种简单的结构),客户端必须创建(可能通过某种工厂函数)传递给我的API:
void my_func(const quaternion_t& my_quat)
Run Code Online (Sandbox Code Playgroud)
我的库会将quaternion_t类型转换为我的内部特征表示.
我不太喜欢选项1,因为我希望在我的API中有更强的输入感.选项2将要求我的客户也使用Eigen,更不用说他们使用不同版本的Eigen时兼容性的潜在问题(顺便说一下,如果重要的话,Eigen是一个只有头的库).这留下了选项3.
人们怎么想?我基本上回答了自己的问题吗?有什么例子吗?
相关问题
我正在 Windows 操作系统上使用 Eclipse 构建一个 C++ 项目,我也在使用 Eigen 线性代数库。我的问题是 Eigen 的编译时间很慢(大约 50 秒)。
我已经尝试过这些建议的解决方案:
#define EIGEN_NO_DEBUG:它减少了额外的 3 秒时间我真的需要一个解决方案,每次我构建项目来测试一些东西时都等待 47 秒是非常不切实际的。
任何想法都非常感谢,谢谢。