上帝函数

393 阅读2分钟

 “上帝函数”是指实现了高级策略的函数。如果在程序中使用这种函数,会导致链接器向可执行文件中添加许多库函数。在嵌入式系统中,可执行文件的增大会耗尽物理内存;而在桌面级计算机上,可执行文件的增大则会增加虚拟内存分页。

在许多现有的库中都存在着性能昂贵的上帝函数。优秀的库在设计时会移除这些函数。但是如果将库作为框架设计,则无法避免上帝函数。

#include <stdio.h>

int main(int, char **){

    printf(“hello world !\n”)

    return 0;

}

这段程序包含了多少个可执行字节呢?如果你觉得“大约50到100字节”,那么你就错了这是两个数量级的差距。在我编写的一个嵌入式控制其中,这段程序占用了8KB。而且这仅仅是代码的大小,不包含符号表,加载器信息和其他任何代码。 下面这段代码完成的工作与之前的代码相同

#include <stdio.h>

int main(int, char**){

    puts(“hello world\n”);

    return 0;

}

这段程序实际上与之前的程序是一样的,只是使用了puts来输出字符串,而没有用printf()。但是第二个程序只占用了大约100字节。导致程序大小区别这么大的原因就是printf()。printf()能够以三四种格式打印各种类型的数据。它能够将某种格式的字符串解释为读取可变数量的参数。printf()自身就是一个大函数,但是真正让它变大的原因是,它引入了格式化各种基本类型的标准库函数。在我的嵌入式控制器上,情况更加糟糕,由于处理器没有实现硬件浮点类型计算,因此我使用了一个函数扩展库。事实上,printf()是上帝函数的典型代表--一个吸收了C运行时库,可以做许多事情的函数。

对于puts()只是将字符串放到标准输出中而已。它的内部非常简单,而且它不会链接标准库中的许多函数。

版权声明:本文为CSDN博主「x-ghost」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/MEIYOUDAO_J…