Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 2
1

Что оптимальнее: передавать матрицу как аргумент, или же формировать её внутри функции?

14.06.2014, 03:05. Показов 1164. Ответов 9
Метки нет (Все метки)

Добрый вечер, уважаемые форумчане!

Я столкнулась с таким вопросом в процессе оптимизации моей программы: что оптимальнее, передавать массив (матрица 5 столбцов на ~8000 строк элементов, все ячейки пустые, кроме первой строки) в функцию как аргумент, или же экономнее будет передать как аргумент массив из 4х известных мне элементов, а саму матрицу формировать уже внутри функции? Будет ли вообще какая-то ощутимая разница? Для решения задачи приемлемы оба варианта.

Функция реализует алгоритм численного решения Рунге-Кутты для системы уравнений, поэтому массив элементов формируется внутри.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2014, 03:05
Ответы с готовыми решениями:

Как лучше передавать аргумент в функцию - по ссылке или по указателю?
Предположим, что нам нужно в функцию передать значение переменной чтобы по окончанию работы функции...

Передавать при создании класса, переменную - аргумент функции
1. Вопрос Конструктор класса - метод: CustomGLWidget::CustomGLWidget(QWidget...

Что лучше передавать из функции в функцию — массив переменных или переменные по одной?
Что лучше передавать из функции в функцию - массив переменных или переменные по одной?

Что оптимальнее - LINQ или циклы
При работе с коллекциями довольно часто возникает необходимость выбрать элементы по некоторым...

9
97 / 71 / 12
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
14.06.2014, 09:22 2
У вас ~ 4*10^4 элементов. Так что ощутимой разницы не заметите. Кроме этого, у вас элементы матрицы - это просто числа.
1
31 / 31 / 19
Регистрация: 03.05.2011
Сообщений: 84
14.06.2014, 10:09 3
В данном случае разницы нет, но, если матрица не меняется, то можно ее передать как
const matrix &mymatrix, в таком случае не будет тратиться время и память на копирование.
1
502 bad gateway
Эксперт PHP
4639 / 3773 / 1572
Регистрация: 24.04.2014
Сообщений: 11,068
14.06.2014, 10:44 4
Лучший ответ Сообщение было отмечено Kiddeness как решение

Решение

Цитата Сообщение от tehnar5 Посмотреть сообщение
в таком случае не будет тратиться время и память на копирование.
при передачи в функцию массив никогда не будет копироваться, передаются указатель на первый элемент
Kiddeness, так что передавай массив и размерность матрицы
1
0 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 2
14.06.2014, 14:25  [ТС] 5
Большое спасибо за ответы! С:
0
2745 / 1903 / 565
Регистрация: 05.06.2014
Сообщений: 5,544
14.06.2014, 15:31 6
при передачи в функцию массив никогда не будет копироваться, передаются указатель на первый элемент
Скопируется, куда он денется. Главное, в заголовке функции указать именно массив (со всеми размерностями), а не "указатель на первый элемент".
0
502 bad gateway
Эксперт PHP
4639 / 3773 / 1572
Регистрация: 24.04.2014
Сообщений: 11,068
14.06.2014, 15:58 7
Цитата Сообщение от Renji Посмотреть сообщение
Скопируется, куда он денется.
ты плохо изучил массивы, в том то и дело что массив в функцию передается ВСЕГДА в виде указателя на первый элемент
попробуй вот такой код, и сравни адреса одного и тогоже элемента:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
void foo(int a[]) {
    cout << &a[2] << endl;
}
int main() {
    int arr[] = {1, 2, 3, 4, 5};
    cout << &arr[2] << endl;
    foo(arr);
}
Добавлено через 9 минут
Цитата Сообщение от Renji Посмотреть сообщение
в заголовке функции указать именно массив (со всеми размерностями)
но даже если так, то все равно передается указатель
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
#define N 5
void foo(int a[N]) {
    cout << &a[2] << endl;
}
int main() {
    int arr[N] = { 1, 2, 3, 4, 5 };
    cout << &arr[2] << endl;
    foo(arr);
}
0
2745 / 1903 / 565
Регистрация: 05.06.2014
Сообщений: 5,544
14.06.2014, 16:04 8
Хм, действительно, мой косяк.
0
502 bad gateway
Эксперт PHP
4639 / 3773 / 1572
Регистрация: 24.04.2014
Сообщений: 11,068
14.06.2014, 16:06 9
можно конечно "заставить" копировать массив, если он является элементом класса, и в конструктор копирования реализовать копирование массива, но тут в функцию уже передается все-таки не массив, а объект некоторого класса
0
Ушел с форума
Эксперт С++
16443 / 7407 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.06.2014, 17:27 10
Цитата Сообщение от Kiddeness Посмотреть сообщение
что оптимальнее, передавать массив (матрица 5 столбцов на ~8000 строк элементов, все ячейки пустые, кроме первой строки) в функцию как аргумент, или же экономнее будет передать как аргумент массив из 4х известных мне элементов, а саму матрицу формировать уже внутри функции?
Оптимальнее будет не гадать, а проверить каким-нибудь профайлером,
который даст точный ответ.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2014, 17:27
Помогаю со студенческими работами здесь

PostDelayed можно ли в Runnable передавать аргумент, как-то так?
Добрый день, форумчане гуру и прочие знающие люди! Помогите начинающему программеру! Есть метод...

Что по скорости оптимальнее ArrayList или List<T>
Собственно вопрос в названии темы. Ну и также интересует также, что оптимальнее - коллекция по...

Что оптимальнее игровой цикл или таймер?
Скорость игрового цикла зависит от fps. Я вот думаю не оптимальнее ли операции, скорость обновления...

А что находится внутри функции MessageBox или как еще можно создать MessageBox?
Помните сказку о лягушке-царевне? Что необходимо было сделать, чтобы убить Кащея-бессмертного?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru