Передать параметры как массив? - PullRequest
1 голос
/ 26 апреля 2011

лучше (производительность ...) передавать параметры в виде массива

template<typename Number>
static int solveQuadraticFunction(Number* dst, const Number* src)
{
  Number a=src[0], b=src[1], c=src[2];
  // …
}

или "стандартный" способ

template<typename Number>
static int solveQuadraticFunction(Number* dst, Number a, Number b, Number c)
{
  // …
}

Ответы [ 6 ]

3 голосов
/ 26 апреля 2011

Все вопросы, касающиеся производительности, в конечном итоге имеют один и тот же ответ - внедрите оба решения и рассчитайте их. Сказав это, я не вижу никакой причины, по которой версия массива будет значительно быстрее или медленнее, но она, конечно, менее удобна и менее читаема.

2 голосов
/ 26 апреля 2011

Вероятно, нет.

Это зависит от расположения аргументов перед вызовом.В первом случае вы требуете, чтобы аргументы были организованы в массив перед вызовом, что может уже иметь место, а может и нет;если это уже так, и существует большое количество аргументов, то он может быть более оптимальным просто потому, что не требует, чтобы значения собирались в стеке.Однако это может привести к тому, что значения будут просто скопированы из массива в стек внутри вызываемой функции вместо снаружи it, в зависимости от того, как вы затем получите доступ к аргументам (конкретный примерВы выглядите проблемно: вы определяете локальные переменные и присваиваете их из элементов массива; локальные переменные обычно живут в стеке, хотя компилятор может их оптимизировать).

Конечно, если аргумент еще не заданРасположенный в массиве перед вызовом, тогда выигрыш не будет (и, вероятно, по крайней мере, будет небольшое наказание), потому что вам нужно найти где-то, чтобы сохранить аргументы в виде массива - что может включать выделение / освобождение памяти - и затем аргументыдолжен быть доступен косвенно через указатель, который также имеет небольшую стоимость.

2 голосов
/ 26 апреля 2011

Я сомневаюсь, что вы увидите разницу в производительности; при соответствующих настройках оптимизации и встраивании компилятор должен иметь возможность решить, какой из них использовать.

Второй вариант предпочтительнее, когда имеется небольшое количество аргументов, поскольку он позволяет компилятору проверять количество передаваемых элементов.

(Но что касается вашего примера, обязательно используйте ссылки: Number const &a=src[0], &b=src[1], &c=src[2]. Они будут оптимизированы любым полуприличным компилятором.)

0 голосов
/ 26 апреля 2011

Конечно, лучше передать адрес первого элемента, а не нажимать все элементы. Вы можете передать указатель или массив по ссылке, как показано ниже:

template<typename Number, unsigned int SIZE>
static int solveQuadraticFunction(Number* dst, Number (&src)[SIZE])
{
  // … src is passed by reference
}
0 голосов
/ 26 апреля 2011

Это зависит от многих вещей и, конечно, зависит от оборудования / платформы. В целом, для многих параметров (> 4) метод массива, вероятно, более эффективен. Если тип параметра не вписывается в регистр ЦП, передача в виде массива всегда должна быть более эффективной.

0 голосов
/ 26 апреля 2011

При вызове второго метода вы будете помещать в стек больше двух переменных, чем первый.

Но это, вероятно, не имеет большого значения, если только он не работал в очень узком цикле.

...