【发布时间】:2017-04-13 08:16:20
【问题描述】:
假设我有这个功能:
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
}
我认为这种方法有两个优点:
-
更易于维护:使用第一种方法,如果我必须向
foom添加一个新参数,那么我还必须修改所有其他m-1foo标题...一场噩梦.使用这种方法,唯一要做的就是向wrapper添加一个新字段。 -
效率更高:假设
n(参数的数量)和m(函数的数量)都很大(比如说都是10),这意味着我们必须复制m*n地址,这不是很大的开销,但肯定比m大。
一切都正确吗?我错过了一些优势/劣势吗? 请注意,这里的性能是首要任务
为什么我需要这个?
好吧,阅读this问题以了解更多信息。
【问题讨论】:
-
有人能解释一下这个效果结构如何对齐吗?包装器结构中会不会有很大的空白?
-
@MartinZhai 感谢您的评论。请解释一下为什么这应该是一个问题?据我所知,当我们想要利用矢量化时,数据对齐很有用,但情况并非如此。还是你的意思是别的?
-
当你把多个结构放在一个包装结构中时,子结构有不同的大小,编译器会对齐它们以提高性能吗? en.wikipedia.org/wiki/Data_structure_alignment
-
@MartinZhai 我认为这取决于编译器。但无论如何,在什么情况下这可能是一个问题?当您想要处理结构内的元素(例如循环中的数组)时,通常会出现对齐问题。这与这个问题有什么关系?
-
我想知道将结构包装到结构中是否会增加内存使用量。
标签: c++ performance pass-by-reference wrapper design-principles