关于返回对象的运算符重载效率

问题描述 投票:0回答:1

我正在尝试编写一个 C++ 类来以特定方式管理数据。更具体:以尽可能少的开销模仿数学矩阵行为,如矩阵乘法和类似的东西。直觉上我想使用重载运算符以获得更好的可读性,但我总是想知道返回结果矩阵的额外分配。如果你考虑一个非常大的矩阵,尤其是关于性能。

到目前为止,我已经完成了所有设置,可以通过提供维度坐标来分配和正确访问存储的数据。这些对象在堆中分配为指针,以通过转换矩阵来做一些奇特的事情。到目前为止添加看起来像这样:

Matrix* Add(Matrix* A, Matrix* B, Matrix* result)
{
[...]  //Math here

return result;
}

所以在计算时,结果是直接写入结果对象,因为它是通过指针访问的。

但是当使用运算符重载时,我的困惑开始增加。我会实施这样的事情(简化,最小的问题):

Matrix* operator+(Matrix& other)
{
Matrix* result = new Matrix;
[...] //Math here
return result;
}

想象我们生活在一个完美的世界中,泄漏被神奇地解决了,但问题仍然存在,我看不到在内部为结果分配内存的方法。如果我已经预先分配了对象或者我从以前的计算中回收了一个对象,那么分配结果内存不会浪费计算能力吗?有没有更有效的方法解决这个问题,或者可能以某种我不知道的方式进行了内部优化?

c++ performance operator-overloading
1个回答
0
投票

您可以使用

shared_ptr
而不是原始指针。最大的优势是它实现了你正在寻找的神奇东西,以避免泄漏。

话虽这么说,你最好管理一个延迟的 Matrix 对象 内存管理到它的内部。最大的优势是您可以处理不同类型的矩阵(例如稀疏矩阵、正态矩阵等)。另一个优点是你让编译器使用移动语义和其他东西来管理优化,这不像指针那么简单。

© www.soinside.com 2019 - 2024. All rights reserved.