包装函数参数?

时间:2017-04-13 08:16:21

标签: c++ performance pass-by-reference wrapper design-principles

我们假设我有这个功能:

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
}

我认为这种方法有两个优点:

  1. 更易于维护:使用第一种方法,如果我必须向foom添加新参数,那么我还必须修改所有其他参数m-1 {{ 1}}标题......一场噩梦。使用此方法,唯一要做的就是向foo添加新字段。
  2. 效率更高:假设wrapper(参数数量)和n(函数数量)都很大(比如10)这意味着我们必须复制m地址,这不是一个很大的开销,但肯定大于m*n
  3. 一切都正确吗?我错过了一些优势/劣势吗? 请注意,此处的效果是优先级

    为什么我需要这个?

    好了,请阅读StoryBoard问题以了解更多信息。

2 个答案:

答案 0 :(得分:1)

这取决于您拥有的参数数量。

一般来说,常见的是将许多参数封装到一个名为" params"例如,这样功能的原型不会太长。

此方案的示例包括FLANNkd-GeRaF(我的)和FALCONN

我没有看到任何情况下参数结构是诚实的,所以这是你个人的判断。

答案 1 :(得分:1)

是的,它更好。你基本上有一组你需要一起操作的变量,它们必须一起传递。主要的优点是,通过将此包变量包装在struct中,您可以为其命名,并简化函数调用。

关于表现:嗯,可能它无关紧要。是的,你使用包装方法在堆栈上传递较少的地址,但是,除非经常进行函数调用(=每秒几百万次),否则不会加速一些事情。如果这些函数调用不是应用程序内部循环的一部分(例如所写代码的99%),则速度差异无关紧要。