【问题标题】:Efficient arithmetic operator overloading in C++11C++11 中的高效算术运算符重载
【发布时间】:2012-07-05 10:56:41
【问题描述】:

我有一个具有多个成员的 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 中使用移动构造函数和右值引用是否有一种非常好的、有效的方法来实现它?请记住,MyDouble 可能是一个大型 POD 结构(即不仅仅是两个双精度)。

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

【问题讨论】:

  • 如果所有内存都包含在结构本身中,则移动构造函数不会真正为您做任何事情,但您仍然有返回值优化,这可能会使隐含的副本变得不必要。跨度>
  • 返回值优化是我应该控制的(即我需要编写一些代码),还是在编译器优化领域?
  • 这是一个编译器优化。
  • 以简单明了的方式做这件事到底是什么效率低下?您是否有显示效率低下的分析数据?
  • @user1487088:为什么不问问移动语义是如何工作的?或者更好的是,查找有关移动语义如何工作的现有问题。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2012-03-11
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多