c语言优化程序空间(c语言程序优化方法)

今天给各位分享c语言优化程序空间的知识,其中也会对c语言程序优化方法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、C语言编程解决最优化问题2、如何将单片机C语言程序改小3、C语言如何提高程序效率4、如何优化你的C代码5、c语言编程中数据存储空间不足时应该怎样修改程序语句6、C语言写程序提高程序效率减小空间的方法都有哪些

C语言编程解决最优化问题

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。

C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。

其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。

c语言优化程序空间(c语言程序优化方法)

如何将单片机C语言程序改小

如果超出太多就另想办法,例如更换单片机。

如果超出得不多,可以进行优化。这里又分为两种情况:如果你编程经验丰富,可以手动通过优化减小程序代码大小;如果你不太懂得如何手动优化,可尝试提高编译优化等级并优先针对代码大小进行优化,不过提高优化等级往往会带来更多的隐患,不建议这么做。

“对于程序中重复出现的指令,用子程序调用的方式是否能将程序大小改小?”你指的是重复代码段吧,某些优化等级下编译器已经自动进行了这种优化,这时再手动合并重复代码段有时反而会导致代码大小增大……需要具体试验进行。记得多备份。

“是不是说

程序的代码行数越少,这个程序的所占的空间大小会越小?”完全不是这么回事,某些时候一行C程序可能会编译出很长的汇编代码,尤其是那些卖弄C语言技巧的家伙们。我之前看过一个例子是某个家伙写的一行高度紧凑的语句编译出了数百字节。当然如果不幸调用了库函数会使得代码大小迅速膨胀。

C语言如何提高程序效率

好的代码没有一个统一的衡量标准,在程序员们的世界里大家也是各自按照自己的标准衡量着自己和别人的代码。不过有一个标准几乎是被所有人认同的。服役时间越长、出错率越高的代码就是好代码。所有的编程方法、代码技巧甚至于设计模式都是为了达到这个目的而产生的。

   如何提高程序效率

程序的效率分两部分:时间效率和空间效率。

时间效率 : 指的是程序运行的速度

空间效率 : 指的是程序占用内存或者外存的大小

对于这两点的把握,我们没有明确的方法。这里给出一些能够达成共识的规则,大家在今后自己编码的时候,可以通过这些规则来衡量自己的代码是否符合要求。

规则1:不要一味地追求程序的效率

如果追求程序效率需要付出降低正确性、可靠性、健壮性、可读性等质量代价,那么可以放弃这部分效率的提高。

规则2:优先提高全局效率

只有整个程序的执行效率提高才有意义,把时间和精力放在某一个不常被调用的小模块优化上得不偿失。

规则3:针对瓶颈部分优化

在实际开发工作中,我们经常遇到一些程序执行时间过长,需要优化。有些人上来就开始逐行检查代码,把认为可能影响效率的地方都尽量修改一遍。这样做不仅浪费时间,更重要的是,常常修改一遍后依然看不到明显的效果。

这种情况下,正确的方法是先找出限制效率的“瓶颈”,在这个部分做有针对性的优化。这么做才事半功倍。

   规则4:先优化数据结构和算法,再优化执行代码

程序的两大要素是算法和数据结构,它们贯穿于程序的始终。因此,对它们的优化能够起到意想不到的良好效果。

规则5:时间效率和空间效率的矛盾

大多数时候,时间效率和空间效率是对立的。这就是程序设计中两个很重要的方法论,一个是“以空间换时间”,另一个是“以时间换空间”。此时应当分析那个更重要,作出适当的折中。

早间年,硬件成本比较高,人们大多都采用以时间换空间的策略,花费一些时间,减少内存开销。如今,内存条的价格已经非常便宜了,人们注重的`是软件的友好性,因此大部分时候都是用空间换时间。

规则6:代码不是越短越好

很多资深程序员都会有这样一个误区,完成同一个功能,代码越短越好。还经常有人说这样的话:“就这么个功能我几行代码就搞定了”。其实,追求代码精简是一个很大的误区。因为精简的代码并不一定产生高效的机器码。同时,它还付出了可读性这一代价。正确的做法是适当地做到代码精简。

注意事项

1. 书写错误

经常有人把“==”误写成“=”。“||”、“”、“=”、“=”这类符号也很容易发生少一个的错误。最可怕的是编译器根本发现不了这样的错误。

2. 初始化

变量(指针、数组)被创建之后应当立刻初始化,防止把未被初始化的变量当成右值使用。

3. 数值错误

这也是一类非常容易忽略的错误。变量的初值、缺省值错误,或精度不够,一旦出错不易发现。

4. 类型转换

为了避免数据类型转换的错误,我们要尽量使用显式的数据类型转换,避免在编译器中执行非我们所愿的隐式数据类型转换。

5. 溢出

溢出分两种,一种是超过数据类型取值范围的赋值,另一种是数组下标范围越界。这两种都是要时刻注意的。

7. 避免编写技巧性很高代码

技巧性过高的代码一定是可读性较差的代码,这种代码不易维护,后期的成本较高。

8. 好代码要复用,坏代码要重写

如果原有的代码质量比较好,尽量复用它。但是不要修补很差劲的代码。当我们遇到差劲代码时,最好的方法是重写新代码替换它。

9. 尽量使用标准库函数

对于标准库中有的函数,我们不要再花时间自己实现。很简单,你自己实现的一定不比库函数效率高。

10. 把编译器的选择项设置为最严格状态

只有最严格的审查自己的代码,才能写出优秀的软件产品。很多人甚至连编译过程中出现的warning都懒得处理,这种态度坚决不能有。

如何优化你的C代码

一、程序结构的优化

1、程序的书写结构

虽然书写格式并不会影响生成的代码质量,但是在实际编写程序时还是应该尊循一定的书写规则,一个书写清晰、明了的程序,有利于以后的维护。在书写程序时,特别是对于While、for、do…while、if…elst、switch…case等语句或这些语句嵌套组合时,应采用“缩格”的书写形式,

2、标识符

程序中使用的用户标识符除要遵循标识符的命名规则以外,一般不要用代数符号(如a、b、x1、y1)作为变量名,应选取具有相关含义的英文单词(或缩写)或汉语拼音作为标识符,以增加程序的可读性,如:count、number1、red、work等。

3、程序结构

C语言是一种高级程序设计语言,提供了十分完备的规范化流程控制结构。因此在采用C语言设计单片机应用系统程序时,首先要注意尽可能采用结构化的程序设计方法,这样可使整个应用系统程序结构清晰,便于调试和维护。于一个较大的应用程序,通常将整个程序按功能分成若干个模块,不同模块完成不同的功能。各个模块可以分别编写,甚至还可以由不同的程序员编写,一般单个模块完成的功能较为简单,设计和调试也相对容易一些。在C语言中,一个函数就可以认为是一个模块。所谓程序模块化,不仅是要将整个程序划分成若干个功能模块,更重要的是,还应该注意保持各个模块之间变量的相对独立性,即保持模块的独立性,尽量少使用全局变量等。对于一些常用的功能模块,还可以封装为一个应用程序库,以便需要时可以直接调用。但是在使用模块化时,如果将模块分成太细太小,又会导致程序的执行效率变低(进入和退出一个函数时保护和恢复寄存器占用了一些时间)。

4、定义常数

在程序化设计过程中,对于经常使用的一些常数,如果将它直接写到程序中去,一旦常数的数值发生变化,就必须逐个找出程序中所有的常数,并逐一进行修改,这样必然会降低程序的可维护性。因此,应尽量当采用预处理命令方式来定义常数,而且还可以避免输入错误。

5、减少判断语句

能够使用条件编译(ifdef)的地方就使用条件编译而不使用if语句,有利于减少编译生成的代码的长度,能够不用判断语句则少用判断用语句。

6、表达式

对于一个表达式中各种运算执行的优先顺序不太明确或容易混淆的地方,应当采用圆括号明确指定它们的优先顺序。一个表达式通常不能写得太复杂,如果表达式太复杂,时间久了以后,自己也不容易看得懂,不利于以后的维护。

7、函数

对于程序中的函数,在使用之前,应对函数的类型进行说明,对函数类型的说明必须保证它与原来定义的函数类型一致,对于没有参数和没有返回值类型的函数应加上“void”说明。如果果需要缩短代码的长度,可以将程序中一些公共的程序段定义为函数,在Keil中的高级别优化就是这样的。如果需要缩短程序的执行时间,在程序调试结束后,将部分函数用宏定义来代替。注意,应该在程序调试结束后再定义宏,因为大多数编译系统在宏展开之后才会报错,这样会增加排错的难度。

8、尽量少用全局变量,多用局部变量。

因为全局变量是放在数据存储器中,定义一个全局变量,MCU就少一个可以利用的数据存储器空间,如果定义了太多的全局变量,会导致编译器无足够的内存可以分配。而局部变量大多定位于MCU内部的寄存器中,在绝大多数MCU中,使用寄存器操作速度比数据存储器快,指令也更多更灵活,有利于生成质量更高的代码,而且局部变量所的占用的寄存器和数据存储器在不同的模块中可以重复利用。

9、设定合适的编译程序选项

许多编译程序有几种不同的优化选项,在使用前应理解各优化选项的含义,然后选用最合适的一种优化方式。通常情况下一旦选用最高级优化,编译程序会近乎病态地追求代码优化,可能会影响程序的正确性,导致程序运行出错。因此应熟悉所使用的编译器,应知道哪些参数在优化时会受到影响,哪些参数不会受到影响。

在ICCAVR中,有“Default”和“Enable Code Compression”两个优化选项。

在CodeVisionAVR中,“Tiny”和“small”两种内存模式。

在IAR中,共有7种不同的内存模式选项。

在GCCAVR中优化选项更多,一不小心更容易选到不恰当的选项。

二、代码的优化

1、选择合适的算法和数据结构

应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大提高程序执行的效率。.选择一种合适的数据结构也很重要,比如你在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。

数组与指针语句具有十分密码的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。但是在Keil中则相反,使用数组比使用的指针生成的代码更短。。

3、使用尽量小的数据类型

能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现。

在ICCAVR中,可以在Options中设定使用printf参数,尽量使用基本型参数(%c、%d、%x、%X、%u和%s格式说明符),少用长整型参数(%ld、%lu、%lx和%lX格式说明符),至于浮点型的参数(%f)则尽量不要使用,其它C编译器也一样。在其它条件不变的情况下,使用%f参数,会使生成的代码的数量增加很多,执行速度降低。

4、使用自加、自减指令

通常使用自加、自减指令和复合赋值表达式(如a-=1及a+=1等)都能够生成高质量的程序代码,编译器通常都能够生成inc和dec之类的指令,而使用a=a+1或a=a-1之类的指令,有很多C编译器都会生成二到三个字节的指令。在AVR单片适用的ICCAVR、GCCAVR、IAR等C编译器以上几种书写方式生成的代码是一样的,也能够生成高质量的inc和dec之类的的代码。

5、减少运算的强度

可以使用运算量小但功能相同的表达式替换原来复杂的的表达式。如下:

(1)、求余运算。

a=a%8;

可以改为:

a=a7;

说明:位操作只需一个指令周期即可完成,而大部分的C编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。通常,只要求是求2n方的余数,均可使用位操作的方法来代替。

(2)、平方运算

a=pow(a,2.0);

可以改为:

a=a*a;

说明:在有内置硬件乘法器的单片机中(如51系列),乘法运算比求平方运算快得多,因为浮点数的求平方是通过调用子程序来实现的,在自带硬件乘法器的AVR单片机中,如ATMega163中,乘法运算只需2个时钟周期就可以完成。既使是在没有内置硬件乘法器的AVR单片机中,乘法运算的子程序比平方运算的子程序代码短,执行速度快。

如果是求3次方,如:

a=pow(a,3.0);

更改为:

a=a*a*a;

则效率的改善更明显。

(3)、用移位实现乘除法运算

a=a*4;

b=b/4;

可以改为:

a=a2;

b=b2;

说明:通常如果需要乘以或除以2n,都可以用移位的方法代替。在ICCAVR中,如果乘以2n,都可以生成左移的代码,而乘以其它的整数或除以任何数,均调用乘除法子程序。用移位的方法得到代码比调用乘除法子程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果,如:

a=a*9

可以改为:

a=(a3)+a

6、循环

(1)、循环语

对于一些不需要循环变量参加运算的任务可以把它们放到循环外面,这里的任务包括表达式、函数的调用、指针运算、数组访问等,应该将没有必要执行多次的操作全部集合在一起,放到一个init的初始化程序中进行。

(2)、延时函数:

通常使用的延时函数均采用自加的形式:

void delay (void)

{

unsigned int i;

for (i=0;i1000;i++)

;

}

将其改为自减延时函数:

void delay (void)

{

unsigned int i;

for (i=1000;i0;i–)

;

}

两个函数的延时效果相似,但几乎所有的C编译对后一种函数生成的代码均比前一种代码少1~3个字节,因为几乎所有的MCU均有为0转移的指令,采用后一种方式能够生成这类指令。

在使用while循环时也一样,使用自减指令控制循环会比使用自加指令控制循环生成的代码更少1~3个字母。

但是在循环中有通过循环变量“i”读写数组的指令时,使用预减循环时有可能使数组超界,要引起注意。

(3)while循环和do…while循环

用while循环时有以下两种循环形式:

unsigned int i;

i=0;

while (i1000)

{

i++;

//用户程序

}

或:

unsigned int i;

i=1000;

do

i–;

//用户程序

while (i0);

在这两种循环中,使用do…while循环编译后生成的代码的长度短于while循环。

7、查表

在程序中一般不进行非常复杂的运算,如浮点数的乘除及开方等,以及一些复杂的数学模型的插补运算,对这些即消耗时间又消费资源的运算,应尽量使用查表的方式,并且将数据表置于程序存储区。如果直接生成所需的表比较困难,也尽量在启动时先计算,然后在数据存储器中生成所需的表,后以在程序运行直接查表就可以了,减少了程序执行过程中重复计算的工作量。

c语言编程中数据存储空间不足时应该怎样修改程序语句

可以用realloc函数

原型:void

*realloc(void

*p,

unsigned

int

size);

作用:P是指向想要扩充内存的存储单元的指针,对给定的指针

p

所指的空间进行扩大或者缩小,size

新的目标大小。

无论是扩张或是缩小,原有内存中的内容将保持不变。

当然,对于缩小,则被缩小的那一部分的内容会丢失。

realloc

并不保证调整后的内存空间和原来的内存空间保

持同一内存地址。相反,realloc

返回的指针很可能指向

一个新的地址。

若分配失败,则返回空指针NULL。

例:T=(ElemType

*)malloc(3*sizeof(ElemType));

p=(ElemType

*)realloc(T,

6*sizeof(ElemType));

其中ElemType是指某一种数据类型

C语言写程序提高程序效率减小空间的方法都有哪些

算法级别的显然是最主要的优化,一个平方级算法和一个超线性算法的时间复杂度天差地别。但如果已经达到了算法的下界,那么就只能是针对程序进行优化了。其实编译器干的坏事往往比好事多,尤其是在做并行的时候~另外,先检查下是否需要优化,如果不是瓶颈的地方再优化也没有明显效果,常用的优化手段一般是增大并行度,指令级或者线程级的,还有就是针对内存结构的特殊处理等等。具体可以参考计算机系统结构——量化研究方法,第三版我觉得不错,第四版没看。至于用C的话,比较灵活,比如自己消除递归,循环强度削弱,使用宏函数或者内联函数,内嵌汇编等等都可以,视情况而定了。

关于c语言优化程序空间和c语言程序优化方法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月30日 00:01:15
下一篇 2024年3月30日 00:09:31

相关推荐

  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    4100
  • c语言控制代码的换码序列,c语言交换代码

    求C语言编程大神解答一下下面这个编程代码? k==5,用5去除125余0,所以r=125%5中r为0。由于!0为1,所以执行while循环体:先打印出5(k的值),再n=n/k==125/5=25;由于251则再打印出*号。这一循环结果输出是5*。 下面是我的代码,三个函数分别对应三个问题。 在实现基本要求的前提下,拓展了可以从键盘输入的功能,以下为各题代码…

    2024年5月23日
    5800
  • c语言扫描io脚状态,c语言端口扫描

    求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。 单片机怎么计算1s内下降沿的个数的C语言程序或者计算两个下降沿的时间(检测脉冲频率)计算1s内下降沿的个数方法是,一个定时器设置定时1…

    2024年5月23日
    4500
  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    4500
  • c语言三位小数,C语言三位小数

    怎样用C++语言输出精确到小数点后三位的数? 1、用C++语言输出精确到小数点后三位的数,可以参考下面给出的代码:coutsetiosflags(ios:fixed)setprecision(3)。其中 setiosflags中set是设置的意思。ios是iostream的缩写,即输入输出流。flags是标志的意思。 2、要精确到小数点后若干位,则数据类型为…

    2024年5月23日
    7500
  • c语言21点游戏,二十一点游戏代码c语言

    如何使用C语言编写简单小游戏? 1、数学知识:长方形的面积S=a*b 长方形周长L=2*(a+b)其中a b分别为长方形的宽和高。算法分析:长方形面积及周长均依赖于宽和高,所以先要输入宽高值,然后根据公式计算,输出结果即可。 2、/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++0、turbo…

    2024年5月23日
    6500
  • c语言当中的null,C语言当中的符号

    C/C++中,NULL和null的区别是什么? nul 和 null要看编译器,不同的编译器有所区别。 所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。 null是是什么都没有的意思。在java中表示空对象。 本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是空集合。\x0d\x0a在ASCII码…

    2024年5月23日
    4700
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    5000
  • 学c语言编程,学c语言编程用什么软件

    编程开发必须要学C语言吗? 1、要学习。编程开发的学习内容主要包括c语言、python和c+语言。C语言作为一种简单灵活的高级编程语言,它是一个面向过程的语言,一般是作为计算机专业的基础入门语言课程。 2、C语言。对于刚接触编程的人来说,先学习C语言是非常重要的。C语言可以说是是计算机编程语言的鼻祖,其他的编程语言几乎全是由C语言变化衍生出来的。 3、不需要…

    2024年5月23日
    3500
  • c语言用string定义字符串,c语言中用string类型来处理字符串类型

    C++怎样定义定义字符串 1、第一是字符数组来表示字符串。用下面的语句声明:char a[10];C语言中字符数组与字符串的唯一区别是字符串末尾有一个结束符\0,而字符数组不需要。 2、在C中定义字符串有下列几种形式:字符串常量,char数组,char指针 字符串常量 即:位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为 …

    2024年5月23日
    4500

发表回复

登录后才能评论



关注微信