汉扬编程 编程大纲 一种简单的优化C函数重复调用的方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

优化前

优化后

Tkinter编程应知应会(2)-最简单的Tkinter程序

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

从C语言开始,学习一门编程语言的第一步一般是编写一段HelloWorld程序,我们继续这个传统,编写一个HelloTkinter程序。其代码如下:

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

from tkinter import *# 构建主窗口main = Tk()# 构建标签Label(main, text=\’Hello Tkinter!\’).pack()# 构建退出按钮Button(main, text=\’Quit\’, command=main.quit).pack()# 执行主循环main.mainloop()包含注释行,代码一共只有9行。

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

第1行是导入tkinter库,这是每个Tkinter程序都必须做的事情。在Python语言中也可以像下面代码这样做:

import tkinter as tk# 构建主窗口main = tk.Tk()# 构建标签tk.Label(main, text=\’Hello Tkinter!\’).pack()# 构建退出按钮tk.Button(main, text=\’Quit\’, command=main.quit).pack()# 执行主循环main.mainloop()导入tkinter库的同时,还可以定义一个包名。这种做法的优点是可以避免不同库之间的类名重复,缺点是使用tkinter库的模块时需要随时指定包名。本连载一律采用第一种用法。

第2行是初始行,Python语言中单行注释的写法是在注释的前面加一个[#]。

第3行main=Tk()构建一个Tk类型的对象作为主窗口。Python语言中不需要声明变量类型即可使用变量。这一点对初学者比较友好。

第5行构建一个标签对象并在主窗口中进行布置。构建标签是使用了两个参数,第一个是父窗口main;第二个是需要表示的文字。其中文字的表明方法有点特别:

text=\’Hello Tkinter!\’这方式相当于在说:指定text属性的值为\’Hello Tkinter\’。这种方式虽然稍显复杂,但是可以自由定义参数的个数和顺序。Python语言中,这种用法大量被使用。

第7行构建了一个退出按钮,除了制定父窗口和表示文字之外,另外指定了按钮的动作:

command=main.quit由于Python是解释语言,因此可以这样理解:当用户按下按钮时,如下的代码会被执行,于是主窗口被关闭。

main.quit()

第9行是执行主窗口的主循环。只有这个mainloop被执行了,程序才可以处理用户的输入信息。程序直至退出才会退出循环。

程序执行结果如下:

视频加载中…

觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

有任何疑问,欢迎留言提问或讨论。

面向对象设计,面向对象编程,面向对象思考!

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/6015.html

C语言库函数之srand()详解

C/C++基础之插入排序

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部