- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用下面的代码
Matrix operator * (const Matrix & obj)
{
Matrix m = Matrix();
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
m[i][j] = 0;
for (int k = 0; k < 4; k++)
m[i][j] += _data[i][k] * obj._data[k][j];
}
return m;
}
像这样
v1 = m_proj * m_view * m_object * v1;
但我猜这是非常未优化的,因为我假设我在运算符中创建的新 Matrix 正在疯狂地被复制。如果我这样做的话
Matrix & operator * (const Matrix & obj)
{
Matrix m = Matrix();
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
m[i][j] = 0;
for (int k = 0; k < 4; k++)
m[i][j] += _data[i][k] * obj._data[k][j];
}
return m;
}
将运算符的返回类型更改为对 Matrix 的引用,整个代码将完全停止工作(它可以编译,只是矩阵没有按预期相乘)。
如果我把它改成
Matrix & operator * (const Matrix & obj)
{
Matrix & m = * new Matrix();
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
m[i][j] = 0;
for (int k = 0; k < 4; k++)
m[i][j] += _data[i][k] * obj._data[k][j];
}
return m;
}
现在它可以工作了,但是我有一个严重的内存泄漏问题。
那么如何解决这个问题呢?有没有优雅的解决方案?
谢谢!
最佳答案
您的函数正在创建一个新对象,它应该按值返回该对象。
您不能返回对局部变量的引用,并且返回对动态分配内存的引用有多个问题:它解决不了任何问题(不会减少表达式创建的对象数量,并且由于动态分配)并增加了内存泄漏。
如果没有 Matrix
类的定义,则不清楚内存是在数组中处理还是动态分配。如果它是动态分配的并且你有一个 C++11 编译器,你可以实现移动构造和移动赋值以及所有这些复制 会消失。
在 C++03(以及 C++11)中,您可以实现 operator*=
并手动处理创建的对象(假设您可以高效地执行此操作):
//v1 = m_proj * m_view * m_object * v1;
Matrix tmp = m_proj;
tmp *= m_view;
tmp *= m_object;
tmp *= v1;
v1 = tmp;
这将创建一个临时文件并就地应用所有乘法,从而减少拷贝数。
无论如何,我不会花太多时间在这上面,因为复制 4x4 矩阵并不昂贵。
关于关于运算符重载和内存泄漏的 C++ 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12717806/
Or 运算符 对两个表达式进行逻辑“或”运算。 result = expression1 Or expression2 参数 result 任意数值变量。 expression1 任意
Not 运算符 对表达式执行逻辑非运算。 result = Not expression 参数 result 任意数值变量。 expression 任意表达式。 说明 下表显示如何
Is 运算符 比较两个对象引用变量。 result = object1 Is object2 参数 result 任意数值变量。 object1 任意对象名。 object2 任意
\ 运算符 两个数相除并返回以整数形式表示的结果。 result = number1\number2 参数 result 任意数值变量。 number1 任意数值表达式。 numbe
And 运算符 对两个表达式进行逻辑“与”运算。 result = expression1 And expression2 参数 result 任意数值变量。 expression1
运算符(+) 计算两个数之和。 result = expression1 + expression2 参数 result 任意数值变量。 expression1 任意表达式。 exp
我对此感到困惑snippet : var n1 = 5-"4"; var n2 = 5+"4"; alert(n1); alert(n2); 我知道 n1 是 1。那是因为减号运算符会将字符串“4”转
我想我会得到 12,而不是 7。 w++,那么w就是4,也就是100,而w++, w 将是 8,1000;所以 w++|z++ 将是 100|1000 = 1100 将是 12。 我怎么了? int
Xor 运算符 对两个表达式进行逻辑“异或”运算。 result = expression1 Xor expression2 参数 result 任意数值变量。 expression1
Mod 运算符 两个数值相除并返回其余数。 result = number1 Mod number2 参数 result 任意数值变量。 number1 任意数值表达式。 numbe
Imp 运算符 对两个表达式进行逻辑蕴涵运算。 result = expression1 Imp expression2 参数 result 任意数值变量。 expression1 任
Eqv 运算符 执行两个表达式的逻辑等价运算。 result = expression1 Eqv expression2 参数 result 任意数值变量。 expression1 任
我有一个运算符重载的简单数学 vector 类。我想为我的运算符(operator)获取一些计时结果。我可以通过计时以下代码轻松计时我的 +=、-=、*= 和/=: Vector sum; for(s
我是用户定义比较运算符的新手。我正在读一本书,其中提到了以下示例: struct P { int x, y; bool operator、运算符<等),我们
在 SQL 的维基百科页面上,有一些关于 SQL 中 bool 逻辑的真值表。 [1] 维基百科页面似乎来源于 SQL:2003 标准。 等号运算符 (=) 的真值表与 SQL:2003 草案中的 I
我遇到了一个奇怪的 C++ 运算符。 http://www.terralib.org/html/v410/classoracle_1_1occi_1_1_number.html#a0f2780081f
我正在阅读关于 SO 和 answers 中的一个问题,它被提到为: If no unambiguous matching deallocation function can be found, pr
我偶然发现了这个解决方案,但我无法理解其中到底发生了什么。谁能解释一下! 据我了解,它试图通过计算一半的单元格然后将其加倍来计算 a*b 网格中的单元格数量。但是我无法理解递归调用。 请不要建议其他解
Go的基本类型 布尔类型bool 长度:1字节 取值:布尔类型的取值只能是true或者false,不能用数字来表示 整型 通用整型 int / uint(有符号 / 无符号,下面也类似) 长度:根据运
在本教程中,您将学习JavaScript中可用的不同运算符,以及在示例的帮助下如何使用它们。 什么是运算符? 在JavaScript中,运算符是一种特殊符号,用于对运算数(值和变量)执行操作。例如,
我是一名优秀的程序员,十分优秀!