我正在編寫模板矩陣類,並且當從運算符返回值時,得到堆棧溢出:+, - ,*適用於較大的矩陣。我寧願以某種方式通過參考返回緩解堆棧,以避免額外的複製,但後來,我還得回去與新構造一個對象,並打破「使用刪除爲每新」的一般規則。由於複製開銷和堆棧限制問題,我無法按值返回,而且由於內存泄漏,我也無法通過引用返回,所以我應該怎麼做?通過引用返回的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