Обтекание аргументов функции?

Давайте предположим, что у меня есть эта функция:

void foo (struct1 &v1, struct2 &v2, ...,  structn &vn){
//do something with a subset some of the arguments...
foo1(v1, v2, ..., vn);
}

void foo1 (struct1 &v1, struct2 &v2, ...,  structn &vn){
//do something with a subset some of the arguments...
foo2(v1, v2, ..., vn);
}

...

void foom (struct1 &v1, struct2 &v2, ...,  structn &vn){
//do something with a subset some of the arguments...
}

Является ли хорошей практикой инкапсулировать все эти аргументы в выделенную структуру и использовать вместо этого только в качестве аргумента? Что-то вроде:

struct wrapper{
strcut1 v1;
struct2 v2;
...
structn vn;
}

void foo (wrapper & w){
//use some of w's fields
foo1(w);
}

void foo1 (wrapper & w){
//use some of w's fields
foo2(w);
}

...

void foom (wrapper & w){
//use some of w's fields
}

Я думаю, что этот подход имеет 2 преимущества:

  1. Это более ремонтопригодно: с первым методом, если мне нужно добавить новый аргумент foomтогда я должен изменить и все остальные m-1 foo Заголовки … кошмар. С этим методом вместо этого единственное, что нужно сделать, это добавить новое поле в wrapper,
  2. Это более эффективно: предположим, что оба n (количество аргументов) и m (количество функций) велико (скажем, 10), это означает, что мы должны скопировать m*n адреса, которые не являются большими накладными расходами, но наверняка больше, чем m,

Все ли правильно? Я пропустил какое-то преимущество / недостаток? Обратите внимание, что производительность здесь является приоритетом

Зачем мне это нужно?

Ну читай этот вопрос, чтобы узнать больше об этом.

2

Решение

Это зависит от количества параметров, которые у вас есть.

В общем, обычным является инкапсуляция многих параметров в одну единственную структуру, называемую, например, «params», чтобы прототип функции не был слишком длинным.

Примером этой схемы являются Flann, кД-GeRaF (мой) и FALCONN.

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

1

Другие решения

Да лучше. У вас в основном есть пакет переменных, которыми вам нужно вместе манипулировать, и которые нужно передавать вместе. Основным преимуществом является то, что, упаковав этот пакет переменных в struct, вы даете ему имя и упрощаете вызовы функций.

Что касается производительности: ну, наверное, это не имеет значения. Да, вы передаете меньше стеков в стеке, однако это не ускорит процесс, если вызов функции не будет выполняться очень часто (= несколько миллионов раз в секунду). Если эти вызовы функций не являются частью внутреннего цикла вашего приложения (например, 99% всего написанного кода), разница в скорости не имеет значения.

1

По вопросам рекламы [email protected]