搜索
写经验 领红包
 > 影视

一种简单的优化c函数重复调用的方法是什么(c语言重复函数)

导语:一种简单的优化C函数重复调用的方法

在程序代码中,经常会出现下图这样的函数,用于获取一个全局数据的地址。此类函数作用单一,往往是为了保持代码结构清晰,但是在程序运行中还是存在函数调用的开销的。这边介绍一种优化调用开销的方法。

仔细观察此类函数,返回的值为全局数据的地址,该地址其实是固定的,每次返回值是相同的,针对这种特性,我们可以使用GNU编译器的__attribute__((const))优化。const属性会让编译只调用一次该函数,后续再调用该函数只需要返回第一次结果即可,从而提高程序执行效率。我们通过一个例子来测试看看。

如图1.c代码使用gcc 1.c编译,执行a.out,可以看到main函数中两次调用都执行了getDev函数。

下面我们在getDev增加const编译属性,重新编译测试。

需要注意,编译时需要制定优化等级,使用-O1及以上优化等级,默认的-O0等级不会使用该编译属性,因为本质该宏是为了优化代码。我们使用gcc –O1 1.c重新编译。

执行结果如下,可以看到main函数中调用了两次getDev函数,实际函数只执行了一次,提高了运行效率。

我们使用objdump来反汇编ELF文件,对比加const属性和不加const属性的代码,可以看到加了const属性的汇编只调用了一次getDev,第一次调用后会把返回值保存,第二次调用直接返回第一次调用的保存值。

从优化后可以看到,在代码4004ec位置,将第一次程序执行返回值保存在rbx寄存器中,第二次调用getDev时,并未调用getDev函数,而是在400501位置直接使用了之前保存在rbx寄存器中的返回值。

优化前

优化后

本文内容由小茜整理编辑!