我正在编写模板矩阵类,并且当从运算符返回值时,得到堆栈溢出:+, - ,*适用于较大的矩阵。我宁愿以某种方式通过参考返回缓解堆栈,以避免额外的复制,但后来,我还得回去与新构造一个对象,并打破“使用删除为每新”的一般规则。由于复制开销和堆栈限制问题,我无法按值返回,而且由于内存泄漏,我也无法通过引用返回,所以我应该怎么做?通过引用返回的C++矩阵类重载运算符
这是我的产品功能(矩阵包含二维数组elems的):
template<typename T, unsigned int n, unsigned int m> template<unsigned int m2>
Matrix<T,n,m2> Matrix<T,n,m>::operator*(Matrix<T,m,m2>& M) {
T prod[n][m2];
if(n*m < GPUAccelerationThreshold)
for(int i = 0; i < n; i++)
for(int j = 0; j < m2; j++) {
prod[i][j] = elems[i][0] * M(0, j);
for(int p = 1; p < m; p++)
prod[i][j] += elems[i][p] * M(p, j);
}
else {
array_view<T, 2> product(n, m2, *prod);
array_view<T, 2> a(n, m, *elems);
array_view<T, 2> b(m, m2, M.elems[0]);
parallel_for_each(
product.extent,
[=](index<2> idx) restrict(amp) {
int row = idx[0];
int col = idx[1];
for (int inner = 0; inner < m; inner++) {
product[idx] += a(row, inner) * b(inner, col);
}
}
);
product.synchronize();
}
return Matrix<T,n,m2>(prod);
}
我在写这个类,因为我想提高GPU的一些矩阵运算(与MS AMP)。我搜索了一个现有的解决方案,发现GPU加速的线性代数库,但是我找不到它们是一个带有+, - ,*运算符的简单矩阵类。也许有人可以推荐我吗?
你能返回一个共享指针吗? – andre
你有没有听说过'pImpl'模式? – Yakk