使用指针或引用返回Boost矩阵是否有优势?

时间:2012-10-13 22:53:11

标签: c++ boost ublas

我正在使用Boost做一些矩阵代数。我试图了解这种优化是否有效。原文:

matrix<double> DoSomething(matrix<double> a, matrix<double> b)
{
    return a + b; //for example
}

优化:

matrix<double>* DoSomething(matrix<double>* a, matrix<double>* b)
{
    return *a + *b; //for example
}

基本上,我假设使用指针作为参数和返回类型会阻止复制大对象。阅读完源代码后,我想知道Boost ublas是否基本能够解决这个问题。看起来你总是在Boost的代码中处理一个引用。

2 个答案:

答案 0 :(得分:3)

这不是优化。事实上,这是一场灾难。您的“优化”代码返回指向函数返回时不再存在的临时对象的指针。如果你试图解决这个问题:

matrix<double>* DoSomething(matrix<double>* a, matrix<double>* b)
{
    return new Matrix<double>(*a + *b); //for example
}
嗯,看看你刚刚在那里做了些什么。您刚刚要求创建一个副本,因为您的新矩阵是由汇总ab的临时复制构造的。更糟糕的是,这段代码现在不再是例外安全的,并且很容易搞砸了调用者,而不是释放分配的矩阵。

所以不管它。它已经过优化,您可以轻松破坏它或使其变得更糟。

答案 1 :(得分:0)

如果你想要最好的性能传递引用(或指针)并返回std :: move:

matrix<double>&& DoSomething(matrix<double>& a, matrix<double>& b)
{
    return std::move(a + b); 
}

所以你要避免复制参数和返回值。但是你只能在C ++ 11中使用std :: move。否则返回一个矩阵:

matrix<double> DoSomething(matrix<double>& a, matrix<double>& b)
{
    return a+b; 
}