我们假设我有这个功能:
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
}
我认为这种方法有两个优点:
答案 0 :(得分:1)
这取决于您拥有的参数数量。
一般来说,常见的是将许多参数封装到一个名为" params"例如,这样功能的原型不会太长。
此方案的示例包括FLANN,kd-GeRaF(我的)和FALCONN。
我没有看到任何情况下参数结构是诚实的,所以这是你个人的判断。
答案 1 :(得分:1)
是的,它更好。你基本上有一组你需要一起操作的变量,它们必须一起传递。主要的优点是,通过将此包变量包装在struct
中,您可以为其命名,并简化函数调用。
关于表现:嗯,可能它无关紧要。是的,你使用包装方法在堆栈上传递较少的地址,但是,除非经常进行函数调用(=每秒几百万次),否则不会加速一些事情。如果这些函数调用不是应用程序内部循环的一部分(例如所写代码的99%),则速度差异无关紧要。