我写了这个问题,参考我昨天写的this one。在一些文件之后,对我来说似乎很清楚,如果不是不可能的话,我想做什么(以及我认为是可能的)几乎是不可能的。有几种方法来实现它,因为我不是一个有经验的程序员,所以我问你你会选择哪一种。我再次解释我的问题,但现在我有一些解决方案要探索。编码实践:在矩阵乘法中按值或引用返回?
我需要
我有一个Matrix类,我想实现矩阵间的乘法,使类用法很直观:
Matrix a(5,2);
a(4,1) = 6 ;
a(3,1) = 9.4 ;
... // And so on ...
Matrix b(2,9);
b(0,2) = 3;
... // And so on ...
// After a while
Matrix i = a * b;
我昨天
有什么此刻我超载了两个运营商operator*
和operator=
,直到昨天晚上,这种方式:
Matrix& operator*(Matrix& m);
Matrix& operator=(Matrix& m);
运算符*实例堆上新的Matrix对象(Matrix return = new Matrix(...)
),设置的值,然后只是:
return *result;
我今天
有什么后discussion我决定以“不同的方式”实现它,以避免用户被任何类型的指针困扰,并保持用法不变。所述“不同的方式”是通过值传递运算符*的返回值:
Matrix operator*(Matrix& m);
Matrix& operator=(Matrix& m);
运算符*实例return
在堆栈上,设置的值,然后返回该对象。
这种方法存在问题:它不起作用。运营商=期望矩阵&和运营商*返回矩阵。此外,这种方法对我来说看起来不太好,因为另一个原因:我正在处理矩阵,它可能非常大,而且这个库的目标是:1)对我的项目来说足够好2)速度快,所以可能传递按价值不应该是一个选择。
我已经探索了哪些解决方案
那么,按照前面discussion的建议,我读到的智能指针一些东西,它们看起来很棒,但我仍无法弄清楚如何解决我的问题与他们。他们处理内存释放和指针复制,但我基本上使用引用,所以他们不看我正确的选择。但我可能是错的。
也许唯一的解决办法是通过价值传递,也许我不能同时获得效率和良好的界面。但是,你是专家,我想知道你的意见。
我同意这一点 - 尽可能多地使用const,然后依靠RVO(返回值优化)之类的内容来避免尽可能多的无关副本。 当然,如果你需要更好的性能,你可以看看peterchen提到的写时复制语义。 – 2009-01-25 11:05:46
第二个片段应该是矩阵运算符*(Matrix const&m)const;实际上如果你打算把它作为一个具有const正确性的成员操作符来实现。 – 2009-01-26 17:52:50
你是对的格雷格。我编辑了这篇文章以反映这一点。 – 2009-01-26 21:31:28