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

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

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.

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

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

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


person justHelloWorld    schedule 13.04.2017    source источник
comment
Может ли кто-нибудь объяснить, как будет выравниваться эта структура эффекта? Будет ли огромное пустое пространство в структуре оболочки?   -  person zhm    schedule 13.04.2017
comment
@MartinZhai Спасибо за ваш комментарий. Пожалуйста, объясните мне, почему это должно быть проблемой? Насколько мне известно, выравнивание данных полезно, когда мы хотим использовать векторизацию, но это не тот случай. Или вы имели в виду что-то другое?   -  person justHelloWorld    schedule 13.04.2017
comment
Когда вы помещаете несколько структур в структуру-оболочку, подструктуры имеют разный размер, будет ли компилятор выравнивать их для повышения производительности? en.wikipedia.org/wiki/Data_structure_alignment   -  person zhm    schedule 13.04.2017
comment
@MartinZhai Я думаю, что это зависит от компилятора. Но в любом случае, в каком сценарии это может быть проблемой? Обычно проблема выравнивания возникает, когда вы хотите обработать элементы внутри структуры, например массива, в цикле. Как это связано с этой проблемой?   -  person justHelloWorld    schedule 13.04.2017
comment
Интересно, увеличит ли обертывание структур в структуру объем используемой памяти?   -  person zhm    schedule 13.04.2017
comment
Я думаю, что используемая память будет равна или больше в зависимости от компилятора. Но, опять же, я думаю, что в данном случае это не повлияет на производительность, так как мы копируем и передаем адрес обертки, который является постоянным (независимо от того, сколько структур внутри или насколько они велики)   -  person justHelloWorld    schedule 13.04.2017


Ответы (2)


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

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

Примером этой схемы являются FLANN, kd-GeRaF (мой) и СОКОЛ.

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

person gsamaras    schedule 13.04.2017

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

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

person cmaster - reinstate monica    schedule 13.04.2017