作者:Hykun | 来源:互联网 | 2023-07-15 18:18
如果一个函数,有10个参数,那么把这十个参数放到一个结构体里,用指针传进来,效率是变高了还是变低了呢?
14 个解决方案
不会提高也不会降低。你不用结构,就要每个参数压栈,如果使用结构,就要每个参数朝结构里赋值,其实都差不多。唯一的不同是:如果数据太大,压栈会造成栈溢出,因此大数据要用指针
大型数据类型使用指针,效率较高!(例如:类等。。。)
小型数据类型使用普通变量就可以了。。。。。。。。
在实现层面上,只要你数据不大,其实本质上并没有多大变化。你放一个结构体里,每个指针还是一样要赋值。
但从设计层面上,显然把这么多的参数放在一个结构体里更好。一个函数的参数个数是不能太多的,太多的话函数接口的可读性、易用性会大大降低,Windows API就是一个典型的例子(单看参数就让你眼花瞭乱)。因为用户看到的只是函数接口,因此接口必须设计的得简单易懂,易于使用。
而且,设计接口时必须能很好应对变化。如果函数的参数很多,那最好的办法就是把其中一些有共性的参数抽离出来,封装成一个独立的结构(或类),这样当函数的参数增加或减少时,只需修改结构里里面的参数个数,而面向用户的函数接口上的参数列表没有任何变化。用户无需作任何修改。
总之,我们需要把变化隐藏在后面,而对用户提供统一的相对不变的接口。
如果仅仅从效率层面上讲的话,肯定是会提升的。但是,考虑到实用性,有如下几点可以参考一下:
1. 定义出的结构体是否通用,如果每个具有很多参数的函数都需要定义一个特定的结构体;那么,定义
结构体是不可取的;
2. 接口的固定性,用结构体指针来代替多参数传递所带来的性能提升是微乎其微的,没有必要为了这点
所谓的性能而修改接口定义,在大型软件开发过程中这点尤为重要。
看原来的参数是如何传递,先前是传值的话而且参数是比较复杂的对象的话,用指针快,因为省去了在栈上创建副本对象的时间。
如果原来的参数是传地址或引用的话,应该效率相差不大。
实际上,原来的十个参数都几乎是整形的
如果用结构体指针,不考虑赋值开销的话,实际上的开销就剩下用每个参数时的简接寻址了
而用十个参数,则要压十次栈,代价要大些,但如果使用寄存器传参数呢?是不是要快一些了?
十个参数的话,传指针要快啊,不然还得10个分别赋值