【问题标题】:Wrapping function arguments?包装函数参数?
【发布时间】: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
}

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

  1. 更易于维护:使用第一种方法,如果我必须向foom 添加一个新参数,那么我还必须修改所有其他m-1 foo 标题...一场噩梦.使用这种方法,唯一要做的就是向wrapper 添加一个新字段。
  2. 效率更高:假设n(参数的数量)和m(函数的数量)都很大(比如说都是10),这意味着我们必须复制m*n地址,这不是很大的开销,但肯定比m 大。

一切都正确吗?我错过了一些优势/劣势吗? 请注意,这里的性能是首要任务

为什么我需要这个?

好吧,阅读this问题以了解更多信息。

【问题讨论】:

  • 有人能解释一下这个效果结构如何对齐吗?包装器结构中会不会有很大的空白?
  • @MartinZhai 感谢您的评论。请解释一下为什么这应该是一个问题?据我所知,当我们想要利用矢量化时,数据对齐很有用,但情况并非如此。还是你的意思是别的?
  • 当你把多个结构放在一个包装结构中时,子结构有不同的大小,编译器会对齐它们以提高性能吗? en.wikipedia.org/wiki/Data_structure_alignment
  • @MartinZhai 我认为这取决于编译器。但无论如何,在什么情况下这可能是一个问题?当您想要处理结构内的元素(例如循环中的数组)时,通常会出现对齐问题。这与这个问题有什么关系?
  • 我想知道将结构包装到结构中是否会增加内存使用量。

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


【解决方案1】:

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

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

这种方案的示例是FLANNkd-GeRaF(我的)和FALCONN

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

【讨论】:

    【解决方案2】:

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

    关于性能:嗯,可能无关紧要。是的,您使用包装方法在堆栈上传递的地址更少,但是,除非该函数调用非常频繁(= 每秒数百万次),否则这不会加快速度。如果这些函数调用不是应用程序内部循环的一部分(例如所有编写的代码的 99%),则速度差异无关紧要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多