为什么不建议函数有太多参数?

Posted 东北码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么不建议函数有太多参数?相关的知识,希望对你有一定的参考价值。

记录一篇今天工作的思考。为什么不建议函数的有太多参数?


今天做组内代码评审时,发现同事的代码有一个小问题,一个函数添加了一个参数后有了7个参数,而公司的编码规范要求,函数的参数不许超过6个。

后来我就研究了一下,为啥不建议函数有太多参数呢?当然函数参数太多,不利于维护,学习成本比较高。除此之外,函数参数太多对性能也有一定的影响。


观察参数传递方式

我做了一个实验,观察对含有6个、7个、8个参数的函数进行调用时,到底有哪些不同,测试代码如下:

#include <iostream>

void func6(int p1, int p2, int p3, int p4, int p5,
           int p6)



void func7(int p1, int p2, int p3, int p4, int p5,
           int p6, int p7)



void func8(int p1, int p2, int p3, int p4, int p5,
           int p6, int p7, int p8)



int main()

    func6(1, 2, 3, 4, 5, 6);
    func7(1, 2, 3, 4, 5, 6, 7);
    func8(1, 2, 3, 4, 5, 6, 7, 8);
    return 0;

我们查看汇编代码,来观察调用时如何传递参数。

我们看一下func6的调用,全部通过寄存器传递。

   0x00005555555551ce <+8>:     mov    r9d,0x6
   0x00005555555551d4 <+14>:    mov    r8d,0x5
   0x00005555555551da <+20>:    mov    ecx,0x4
   0x00005555555551df <+25>:    mov    edx,0x3
   0x00005555555551e4 <+30>:    mov    esi,0x2
   0x00005555555551e9 <+35>:    mov    edi,0x1
   0x00005555555551ee <+40>:    call   0x555555555169 <func6(int, int, int, int, int, int)>

我们看一下func7的调用,参数1~6通过寄存器,参数7通过堆栈传递。


   0x00005555555551f3 <+45>:    push   0x7
   0x00005555555551f5 <+47>:    mov    r9d,0x6
   0x00005555555551fb <+53>:    mov    r8d,0x5
   0x0000555555555201 <+59>:    mov    ecx,0x4
   0x0000555555555206 <+64>:    mov    edx,0x3
   0x000055555555520b <+69>:    mov    esi,0x2
   0x0000555555555210 <+74>:    mov    edi,0x1
   0x0000555555555215 <+79>:    call   0x555555555188 <func7(int, int, int, int, int, int, int)>

我们看一下func8的调用,参数16通过寄存器,参数78通过堆栈传递。

   0x000055555555521e <+88>:    push   0x8
   0x0000555555555220 <+90>:    push   0x7
   0x0000555555555222 <+92>:    mov    r9d,0x6
   0x0000555555555228 <+98>:    mov    r8d,0x5
   0x000055555555522e <+104>:   mov    ecx,0x4
   0x0000555555555233 <+109>:   mov    edx,0x3
   0x0000555555555238 <+114>:   mov    esi,0x2
   0x000055555555523d <+119>:   mov    edi,0x1
   0x0000555555555242 <+124>:   call   0x5555555551a7 <func8(int, int, int, int, int, int, int, int)>

结论

gcc编译器(gcc9),在x64环境下。函数调用时,前6个参数通过寄存器传递,超过6个后面的参数通过堆栈传递。而寄存器传递参数比堆栈传递效率高,所以建议函数参数不要超过6个。

学习c++还是要学习一些汇编的,可以解决很多问题啊。


最后,东北码农,全网同名,求关注、点赞、转发,谢谢~

以上是关于为什么不建议函数有太多参数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Google Colab 说我有太多会话?

是否有太多的开关盒可以减少圈复杂度?

有太多线程吗?

Zabbix系统性能优化建议

Python:jupyter notebook打开函数参数提示快捷键

第一波瓜果盲盒发出去了,我有太多话要说!