0

我正在使用 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 代码中的引用。

4

2 回答 2

3

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

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

好吧,看看你刚才在那里做了什么。您只是要求创建一个副本,因为您的新矩阵是从求和ab. 更糟糕的是,这段代码现在不再是异常安全的,而且很容易在调用者中搞砸而不释放分配的矩阵。

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

于 2012-10-13T22:57:20.477 回答
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; 
}
于 2012-10-13T23:10:13.240 回答