Скажем, мы создаем класс Matrix<n, m>
, который хранит целые числа nxm в переменной-члене std::array<std::array<int, m>, n> inner;
. Теперь есть два способа сделать сложение:
Метод 1 ) Возврат по значению (возможно constexpr
)
template<int n, int m> class Matrix {
...
constexpr Matrix add(const Matrix& that) const {
matrix ret;
for (int y = 0; y < n; y++)
for (int x = 0; x < m; x++)
ret.inner[y][x] = this->inner[y][x] + that.inner[y][x];
return ret;
}
...
}
Метод 2 ) Возврат указателя (constexpr
невозможен)
template<int n, int m> class Matrix {
...
Matrix *add(const Matrix& that) const {
Matrix *ret = new Matrix();
for (int y = 0; y < n; y++)
for (int x = 0; x < m; x++)
ret->inner[y][x] = this->inner[y][x] + that.inner[y][x];
return ret;
}
...
}
Моя программа должна выполнить арифметику c с 1000x1000
матрицами (изображениями), поэтому используется Метод 1 Я получаю переполнение стека немедленно. Моя программа также работает с небольшими 4x4
матрицами (матрицами плотности в квантовых вычислениях), которые необходимо вычислять во время компиляции, поэтому использование Method 2 невозможно при этих constexpr
инициализациях.
Вопрос : мне нужно сделать две версии каждого метода, возвращающего Matrix
? (один возвращает Matrix
, а другой возвращает Matrix*
) Это будет много повторяющегося кода. Насколько распространена эта проблема? Есть ли альтернативный способ использования кучи, так что Метод 2 также возможен из constexpr
?
В этом ответе упоминается, что семантика перемещения немного сместила предпочтение в Метод 1 . Но как насчет переполнения стека?