Если вы определили распределение / освобождение памяти как узкое место и хотите, чтобы это было быстрее, первое очевидное решение - использовать непрерывный буфер для ваших массивов.Вы по-прежнему можете предоставить матричный интерфейс, который обращается к ним как к двумерным массивам.
// Rudimentary Implementation
template <class T>
class SquareMatrix
{
public:
explicit SquareMatrix(int i_size):
size(i_size), mat(new T[i_size * i_size]) {}
~SquareMatrix()
{
delete[] mat;
}
// could also be column depending on row-major/col-major
T* operator[](unsigned int row)
{
return mat + row * size;
}
// could also be column depending on row-major/col-major
const T* operator[](unsigned int row) const
{
return mat + row * size;
}
private:
unsigned int size;
T* mat;
};
Второе очевидное, что нужно сделать, - вместо трех матриц иметь одну матрицу, составленную из структуры, содержащей все данные.тебе нужно.Это предполагает, что одной матрицы кортежей будет достаточно, что, по-видимому, имеет место с кодом, который вы опубликовали.
Если вы действительно хотите использовать хардкор и требовать несколько матриц, то напишите для этого свой собственный распределитель памяти.Вы можете выделить память для нескольких матриц одновременно и просто сконструировать их с помощью размещения new.Некоторое дальнейшее чтение и изучение необходимо, если вы хотите сделать это, так как написание распределителей памяти не является тривиальной задачей: вам нужно рассмотреть такие вопросы, как выравнивание, но это самый быстрый путь.
Я рекомендую вам по-прежнемузахватите профилировщик, а не полагайтесь на временные тесты и сделайте правильный анализ графа вызовов вашего кода.Это скажет вам точно, сколько времени тратится где.Может случиться так, что построение / уничтожение объектов в ваших матрицах не так дешево, как могло бы быть, например.
За исключением очевидной алгоритмической неэффективности, даже чрезвычайно знающие программисты часто ошибаются в отношении узких мест в своихкод.Профилировщик - ваш лучший друг, если важна эффективность.