c语言提高函数调用的效率 c语言函数调用的三种方式

C语言中有哪些实用的编程技巧这篇文章主要介绍了C语言高效编程c语言提高函数调用的效率的几招小技巧,本文讲解了以空间换时间、用数学方法解决问题以及使用位操作等编辑技巧,并给出若干方法和代码实例,需要的朋友可以参考下
引言:
编写高效简洁的C语言代码c语言提高函数调用的效率,是许多软件工程师追求的目标 。本文就工作中的一些体会和经验做相关的阐述c语言提高函数调用的效率,不对的地方请各位指教 。
第1招:以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么 , 从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招——以空间换时间 。
例如:字符串的赋值 。
方法A , 通常的办法:
代码如下:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,“This is a example!!”);
方法B:
代码如下:
const char string2[LEN] =“This is a example!”;
char * cp;
cp = string2 ;
(使用的时候可以直接用指针来操作 。)
从上面的例子可以看出 , A和B的效率是不能比的 。在同样的存储空间下,B直接使用指针就可以操作了 , 而A需要调用两个字符函数才能完成 。B的缺点在于灵活性没有A好 。在需要频繁更改一个字符串内容的时候 , A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率 。
如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数 。
该招数的变招——使用宏函数而不是函数 。举例如下:
方法C:
代码如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK(int __bf)
{
return ((1U(bw ## __bf)) - 1)(bs ## __bf);
}
void SET_BITS(int __dst, int __bf, int __val)
{
__dst = ((__dst)~(BIT_MASK(__bf))) | /
(((__val)(bs ## __bf))(BIT_MASK(__bf))))
}
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
方法D:
代码如下:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
#define BIT_MASK(__bf) (((1U(bw ## __bf)) - 1)(bs ##__bf))
#define SET_BITS(__dst, __bf, __val) /
((__dst) = ((__dst)~(BIT_MASK(__bf))) | /
(((__val)(bs ## __bf))(BIT_MASK(__bf))))
SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);
函数和宏函数的区别就在于 , 宏函数占用了大量的空间,而函数占用了时间 。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项 , 一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作 , 所以,函数调用需要一些CPU时间 。而宏函数不存在这个问题 。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出 。
D方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能 。C方法是其变体,其中滋味还需大家仔细体会 。
第2招:数学方法解决问题
现在我们演绎高效C语言编写的第二招——采用数学方法来解决问题 。
数学是计算机之母,没有数学的依据和基?。兔挥屑扑慊姆⒄梗栽诒嘈闯绦虻氖焙?nbsp;, 采用一些数学方法会对程序的执行效率有数量级的提高 。
举例如下 , 求 1~100的和 。
方法E
代码如下:
int I , j;
for (I = 1 ;I=100; I){
j= I;
}
方法F
代码如下:
int I;
I = (100 * (1 100)) / 2
这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的 。当时我只有小学三年级 , 可惜我当时不知道用公式 N×(N 1)/ 2来解决这个问题 。方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1次乘法,1次除法 。效果自然不言而喻 。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率 。
第3招:使用位操作
实现高效的C语言编写的第三招——使用位操作,减少除法和取模的运算 。
在计算机程序中 , 数据的位是可以操作的最小数据单位 , 理论上可以用“位运算”来完成所有的运算和操作 。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率 。举例如下:
方法G
代码如下:
int I,J;
I = 257 /8;
J = 456 % 32;
方法H
int I,J;
I = 257 3;
J = 456 - (45644);
在字面上好像H比G麻烦了好多 , 但是,仔细查看产生的汇编代码就会明白,方法G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁,效率更高 。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C来看,效率的差距还是不小 。相关汇编代码就不在这里列举了 。
运用这招需要注意的是 , 因为CPU的不同而产生的问题 。比如说 , 在PC上用这招编写的程序 , 并在PC上调试通过 , 在移植到一个16位机平台上的时候 , 可能会产生代码隐患 。所以只有在一定技术进阶的基础下才可以使用这招 。
第4招:汇编嵌入
高效C语言编程的必杀技 , 第四招——嵌入汇编 。
“在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾” 。这种说法虽然偏激了一些,但是却有它的道理 。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率 , 我们只好采用变通的方法——嵌入汇编 , 混合编程 。
举例如下,将数组一赋值给数组二,要求每一字节都相符 。
代码如下:
char string1[1024],string2[1024];
方法I
代码如下:
int I;
for (I =0 ;I1024;I)
*(string2I) = *(string1I)
方法J
代码如下:
#ifdef _PC_
int I;
for (I =0 ;I1024;I)
*(string2I) = *(string1I);
#else
#ifdef _ARM_
__asm
{
MOV R0,string1
MOV R1,string2
MOV R2,#0
loop:
LDMIA R0!, [R3-R11]
STMIA R1!, [R3-R11]
ADD R2,R2,#8
CMP R2, #400
BNE loop
}
#endif
方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作 。这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作 。这个例程典型应用于LCD数据的拷贝过程 。根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率 。
虽然是必杀技 , 但是如果轻易使用会付出惨重的代价 。这是因为 , 使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用 。切记,切记 。
虚函数是可以内联的,这样就可以减少函数调用的开销,提高效率当然不能c语言提高函数调用的效率,虚函数意味在运行期确定函数的调用地址,内联函数如同宏的用法一样,相当于在编译期把调用内联的地方加上c语言提高函数调用的效率了函数实现的代码 。前者是动态的,后者是静态的 。
另外 , 即使编译器通过了编译,那么函数也不可能是内联的
如果还没解决你的问题,可以加我百度HI账号 。
C语言中,函数和函数指针,效率上差很多吗?1.直接调用函数,编译的时候,被调函数的地址(或偏移)直接写入指令;
2.使用函数指针时,运行期从内存中取地址 , 在使用call指令
理论上 , 这存在效率差异 。
根据你的系统环境:服务器、PC还是嵌入式处理器、单片机等 , 及你的代码的时间敏感程度:如时序严格的驱动还是MS , 等等因素,自己可以判断使用 。还有一点需要强调:使用函数指针是为了获得某种灵活或模型(C编译器内部大量使用函数指针),所以,这是一种平衡 。
C语言函数的运用及调用C语言函数的运用及调用
1.当程序变得越来越复杂的时候,c语言提高函数调用的效率我们可以使用函数进行完成任务 , 并不再是进行编写 。
2.C语言本身就具有丰富的库函数c语言提高函数调用的效率:
目录路径函数
字符类型分类函数
内存管理函数
数学函数
进程控制函数
日期和时间函数
接口函数
输入输出函数
图形函数
诊断函数
3.每一种函数都有它的作用 , 在需要使用时,直接进行调用就可以c语言提高函数调用的效率了 。
4.函数分为有参和无参函数 。
参数可以分为形参与实参 。
形参在函数内,而实参在函数外 。
形参直接使用,而实参在函数外调用 。
5. 函数的值只能通过return语句返回主调函数 。
6.在函数内有局部变量和全局变量两种,局部变量在函数内使用 , 而全局变量可在函数中使用 。
7.从变量作用域可以划分全局,而在变量的生存期可以分为静态与动态存储方式 。
固定的存储空间与运行时分配的存储空间方式还是有所不同的 。
auto声明自动变量,自动变量用关键字作存储类别的声明,在函数调用结束将会自动释放这些存储空间 。
static可以声明局部变量,在函数调用结束之后不消失而保留原值 。
8.register可以声明局部变量 , 在函数调用时为c语言提高函数调用的效率了提高效率,可以寄存在CPU的寄存器中 。
extern可以声明局部变量,扩展程序文件中的作用域 。
C语言如何提高程序效率 好的代码没有一个统一的衡量标准 , 在程序员们的世界里大家也是各自按照自己的标准衡量着自己和别人的代码 。不过有一个标准几乎是被所有人认同的 。服役时间越长、出错率越高的代码就是好代码 。所有的编程方法、代码技巧甚至于设计模式都是为了达到这个目的而产生的 。
如何提高程序效率
程序的效率分两部分:时间效率和空间效率 。
时间效率 : 指的是程序运行的速度
空间效率 : 指的是程序占用内存或者外存的大小
对于这两点的把握,我们没有明确的方法 。这里给出一些能够达成共识的规则,大家在今后自己编码的时候,可以通过这些规则来衡量自己的代码是否符合要求 。
规则1:不要一味地追求程序的效率
如果追求程序效率需要付出降低正确性、可靠性、健壮性、可读性等质量代价,那么可以放弃这部分效率的提高 。
规则2:优先提高全局效率
只有整个程序的执行效率提高才有意义,把时间和精力放在某一个不常被调用的小模块优化上得不偿失 。
规则3:针对瓶颈部分优化
在实际开发工作中,我们经常遇到一些程序执行时间过长,需要优化 。有些人上来就开始逐行检查代码,把认为可能影响效率的地方都尽量修改一遍 。这样做不仅浪费时间,更重要的是,常常修改一遍后依然看不到明显的效果 。
这种情况下,正确的方法是先找出限制效率的“瓶颈” , 在这个部分做有针对性的优化 。这么做才事半功倍 。
规则4:先优化数据结构和算法,再优化执行代码
程序的两大要素是算法和数据结构,它们贯穿于程序的始终 。因此,对它们的优化能够起到意想不到的良好效果 。
规则5:时间效率和空间效率的矛盾
大多数时候,时间效率和空间效率是对立的 。这就是程序设计中两个很重要的方法论,一个是“以空间换时间” , 另一个是“以时间换空间” 。此时应当分析那个更重要,作出适当的折中 。
早间年,硬件成本比较高,人们大多都采用以时间换空间的策略,花费一些时间,减少内存开销 。如今 , 内存条的价格已经非常便宜了,人们注重的`是软件的友好性,因此大部分时候都是用空间换时间 。
规则6:代码不是越短越好
很多资深程序员都会有这样一个误区,完成同一个功能,代码越短越好 。还经常有人说这样的话:“就这么个功能我几行代码就搞定了” 。其实,追求代码精简是一个很大的误区 。因为精简的代码并不一定产生高效的机器码 。同时 , 它还付出了可读性这一代价 。正确的做法是适当地做到代码精简 。
注意事项
1. 书写错误
经常有人把“==”误写成“=” 。“||”、“”、“=”、“=”这类符号也很容易发生少一个的错误 。最可怕的是编译器根本发现不了这样的错误 。
2. 初始化
变量(指针、数组)被创建之后应当立刻初始化,防止把未被初始化的变量当成右值使用 。
3. 数值错误
这也是一类非常容易忽略的错误 。变量的初值、缺省值错误,或精度不够,一旦出错不易发现 。
4. 类型转换
为了避免数据类型转换的错误,我们要尽量使用显式的数据类型转换,避免在编译器中执行非我们所愿的隐式数据类型转换 。
5. 溢出
溢出分两种,一种是超过数据类型取值范围的赋值,另一种是数组下标范围越界 。这两种都是要时刻注意的 。
7. 避免编写技巧性很高代码
技巧性过高的代码一定是可读性较差的代码,这种代码不易维护 , 后期的成本较高 。
8. 好代码要复用,坏代码要重写
如果原有的代码质量比较好,尽量复用它 。但是不要修补很差劲的代码 。当我们遇到差劲代码时,最好的方法是重写新代码替换它 。
9. 尽量使用标准库函数
对于标准库中有的函数,我们不要再花时间自己实现 。很简单 , 你自己实现的一定不比库函数效率高 。
10. 把编译器的选择项设置为最严格状态
只有最严格的审查自己的代码,才能写出优秀的软件产品 。很多人甚至连编译过程中出现的warning都懒得处理,这种态度坚决不能有 。
c语言如何提高递归函数效率可以改成非递归 , 不过递归改成非递归不是很容易 。
此外设计递归算法时要加上约束函数和上界函数进行启发式搜索 。避免搜索不必要的分支 。
【c语言提高函数调用的效率 c语言函数调用的三种方式】c语言提高函数调用的效率的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言函数调用的三种方式、c语言提高函数调用的效率的信息别忘了在本站进行查找喔 。

    推荐阅读