2017-04-13 186 views
2

让我们假设我有这样的功能:包装函数参数?

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-1foo标题......一场噩梦。使用这种方法,唯一要做的就是向wrapper添加一个新字段。
  2. 这是更有效的:假设两个n(参数的个数)和m(函数的数量)大(比如两个10),这意味着我们必须复制m*n地址,这是不是一个大的开销,但肯定比m大。

一切正确吗?我错过了一些优势/劣势? 请注意,在这里表现都优先

为什么我需要这个?

那么,读this问题了解更多关于它。

+0

有没有人可以解释这种效应结构如何对齐?包装结构中是否会有巨大的空白空间? –

+0

@MartinZhai感谢您的评论。请解释我为什么这应该是一个问题?据我所知,当我们想利用向量化时,数据对齐是有用的,但这不是这种情况。还是你的意思是别的? – justHelloWorld

+0

当您将多个结构放入包装结构中时,子结构具有不同的大小,编译器是否将它们对齐以提高性能? https://en.wikipedia.org/wiki/Data_structure_alignment –

回答

1

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

一般来说,常见的做法是将许多参数封装到一个名为“params”的单个结构中,以便函数的原型不会太长。

该方案的示例是FLANN,kd-GeRaF(mine)和FALCONN

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

1

是的,它会更好。你基本上有一组需要一起操作的变量,并且必须一起传递。主要优点是,通过将这一组变量包装在一个struct中,可以给它一个名称,并简化函数调用。

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