我正在使用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的代码中处理一个引用。
答案 0 :(得分:3)
这不是优化。事实上,这是一场灾难。您的“优化”代码返回指向函数返回时不再存在的临时对象的指针。如果你试图解决这个问题:
matrix<double>* DoSomething(matrix<double>* a, matrix<double>* b)
{
return new Matrix<double>(*a + *b); //for example
}
嗯,看看你刚刚在那里做了些什么。您刚刚要求创建一个副本,因为您的新矩阵是由汇总a
和b
的临时复制构造的。更糟糕的是,这段代码现在不再是例外安全的,并且很容易搞砸了调用者,而不是释放分配的矩阵。
所以不管它。它已经过优化,您可以轻松破坏它或使其变得更糟。
答案 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;
}