Прежде всего, в большинстве случаев я бы не советовал так вручную управлять вашей памятью.Я уверен, что вы слышали, что C ++ предлагает контейнерные классы, к которым могут применяться «алгоритмы».Эти контейнеры менее подвержены ошибкам (особенно в случае исключений), операции более выразительны, оптимизированы и обычно хорошо протестированы, поэтому доказали свою работоспособность.
В вашем случае, с размером массива, известным ранееможно использовать std :: vector без потери производительности (кроме как при создании), поскольку память гарантированно будет непрерывной и, следовательно, может использоваться как массив.Вам также следует подумать о выравнивании массива, так как вызов процедуры выделения в цикле не совсем быстрый - выделение затратно.При выполнении умножения матриц учитывайте распределение в парах строка-майор / столбец-мажор, это помогает кешированию ... но я отвлекся.
Это всего лишь общий совет - я не советую вамчтобы повторно реализовать это с помощью контейнеров, я просто почувствовал необходимость упомянуть их.
В этом конкретном случае, поскольку вы упомянули, что хотите «выполнять математические алгоритмы», я бы посоветовал вам взглянуть начисловая библиотека, которая может выполнять матричные / векторные операции, так как это, кажется, то, что вам нужно.
Для C ++ есть, например, Newmat и (более или менее)) канонические реализации BLAS / LAPACK (то есть Netlib , AMD ACML , ATLAS ).Они позволяют вам выполнять обычные (и не очень распространенные) операции, такие как сложение / вычитание векторов, умножение матриц и т. Д., Намного быстрее, как с использованием оптимизированных алгоритмов, так и оптимизаций в качестве инструкций SIMD, которые может предложить ваш процессор (например, SSE).
Очевидно, что при выполнении вычислений невозможно избежать итерации по этим значениям, но вы можете сделать это оптимизированным способом и со стандартным интерфейсом.