c++ - C++11 中的高效算术运算符重载

标签 c++ c++11 operator-overloading rvalue-reference move-semantics

我有一个包含多个成员的 POD 结构,我想知道 C++11 中实现其算术运算符的最有效方法。

此结构旨在代替数学上下文中的基元;例如:

template<typename Double>
Double calcSomething(const Double& d0, const Double& d1, const Double& d2)
{
    return d0*d1 + 3*d2 - 6;
}

其中 Double 要么只是一个普通的 double,要么是一个包含所有相关重载运算符的 POD 结构:

struct MyDouble
{
    MyDouble(double a, double b) : _a(a), _b(b) {}
    double _a;
    double _b;
};
MyDouble operator+(const MyDouble& d0, const MyDouble& d1) 
{
    return MyDouble(d0._a + d1._a, d0._b + d1._b);
}

在 C++11 中是否有一种非常好的、有效的方法使用 move 构造函数和右值引用来实现它?请记住,MyDouble 可能是一个大型 POD 结构(即不仅仅是两个 double )。

我想继续讨论没有指针指向堆分配内存的结构。

最佳答案

如果结构不拥有任何其他对象或资源,则 move 语义和复制语义是相同的。即使是 move 构造函数或 move 赋值运算符也需要将所有数据成员复制到目标对象。它只是不必执行复制,即拥有的子对象只是转移到目标对象,而不是被复制。

如果你的结构真的很大,你可以创建一个持有者类型,它包含一个指向堆分配实例的指针(最好使用 scoped_ptr)。然后,您可以支持该持有人类型的 move - 实际上,如果您使用 scoped_ptr 管理实际实例,我认为您将自动获得 move 支持。

关于c++ - C++11 中的高效算术运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11337528/

相关文章:

c++ - 无法让 SFML 音乐工作

c++ - 运算符==考虑非静态成员函数的重载

c++ - 如何在新调用中使用更多参数?

c++ - 如何正确实现 `operator/` ?

android - 为什么在 android list 中关闭 debuggable 会导致数据对齐错误?

c++ - 不可复制但可移动的容器

c++ - 如何使用 cv::findcontours 和 DFT?它导致调试错误

c++11 - vector 不转换大括号括起来的列表

c++ - 在 C++ 中使用 while 循环查找一组数字中的最小值的程序

c++ - 在 Qt 应用程序中使用 sleep_for()