【C语言入门教程】5.5 实现问题(效率)
在设计函数时需要遵循一些基本原则,因为影响到函数的执行效率和可用性。函数是代码复用的基础,一个健壮的函数或由函数组成的函数集可以在多个程序中使用。C语言标准库里存放的就是这样的函数,这些函数被放置在头文件中,使用时将它包含在程序内即可。
5.5.1 参数 和 通用函数
通用函数 是指能够复用的函数,这一类函数的显著特点是,只使用参数作为接口传递数据。如果一个函数中依赖全局变量访问调用者的数据,在另一个程序中环境改变了,这个函数就无法运行。因此,不应该把函数建立在全局
变量上,函数所需要的所有数据都因从参数获得。使用参数传递数据除了有助于函数的复用以外,还能提高代码的可读性。
程序测试 是程序设计中的一个重要步骤,在 C 语言程序设计中,模块测试是针对函数的测试方法。将函数独立于程序外,模拟调用者的所需要传递的各种数据和程序运行时的不同状态,借助GDB 等调试工具检验函数体内的代码是否正常运行,以及函数返回的结构是否符合预期,是一种常用的模块测试方法。函数只有在通过严格的模块测试后,才能称为通用函数。
5.5.2 效率
函数是 C 语言的基本构件,所有的程序都是又函数组成。C 语言程序执行的入口是 main 函数,当 main() 函数调用了子函数时,操作系统为子函数在内存中建立一种称为栈的数据结构,将主函数的返回地址和子函数的局部变量保存在栈中。如果子函数再调用另一个子函数,那么依旧是遵循上述原则。建立栈数据结构的系统开销比较大,所以会影响程序的执行效率,特别是在一个函数反复嵌套调用时,如递归调用,如图 9.3 所示。
因此,函数的调用结构应趋向于扁平的结构,例如主函数调用子函数 A 结束后,再调用子函数 B,如 9.4 所示。