C 语言编程技巧

编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就是针对编程工作中的一些体会和经验做相关的阐述。

  第一招:以空间换时间

  计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第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方法是其变体,其中滋味还需大家仔细体会。

时间: 2024-10-09 19:33:38

C 语言编程技巧的相关文章

C语言编程技巧札记

1.size_t:size_t的全称应该是size type,就是说"一种用来记录大小的数据类型".属于C99标准,它所定义的变量可以进行加减乘除运算.因此函数中表示数据大小的变量,推荐使用这个类型!例如: int xxx(void *p, size_t len); 参考:博客连接 2.指针的指针(双重指针)的作用: 1)用来传递需要修改的指针参数到函数中: 2)用来动态生成多维数组: 3)多用于指针交换,可以避免数据复制,提升系统的性能,同时还可以让函数修改指针,例如扩充其大小,指向

C语言编程技巧(注意点)

假设所有变量都已经定义了.符号大部分是全角符号,代码不能直接复制,只做参考. 1.两个数据进行比较时,尽量把已知数放在前面.例如:a = 2;scanf("%d",&b); if( a > b){...};不建议写成 if(b > a){.....} 2.程序的出口尽量的少,即return 语句尽量少.例如:找出a,b,c中最大数,只在最后return最大数. 3.关于scanf("%d%d",&a,&b);两个%d之间可以加入各

R语言基础编程技巧汇编 - 26

1.      监视R语言包更新状态的网站 R语言包的数量已经有近万个,及时关注新发布的包,以及已发布的包的更新状态,非常重要,下列网站提供了这个功能,读者可以经常访问: http://lib.stat.cmu.edu/R/CRAN/web/packages/available_packages_by_date.html 2.      使用命令行参数的R程序示例 以Windows系统为例,按照以下步骤: 1.    把Rscript.exe的路径加入到Path环境变量中,在我的机器上设置如下:

单片机应用编程技巧问答

1. C语言和汇编语言在开发单片机时各有哪些优缺点? 答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言.其主要优点是占用资源少.程序执行效率高.但是不同的CPU,其汇编语言可能有所差异,所以不易移植. C语言是一种结构化的高级语言.其优点是可读性好,移植容易,是普遍使用的一种计算机语言.缺点是占用资源较多,执行效率没有汇编高. 对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM.RAM.STACK等资源都有限,如果使用C语言编写,一条C语言指令编译

java命名规范和编程技巧

一个好的java程序首先命名要规范. 命名规范 定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,方便维护等作用 Package 的命名 Package 的名字应该都是由一个小写单词组成. Class 的命名 Class 的名字必须由大写字母开头而其他字母都小写的单词组成 Class 变量的命名 变量的名字必须用一个小写字母开头,后面的单词用大写字母开头. Static Final 变量的命名  Static Final 变量的名字应该都大写,并且指出完整含义. 参数的命名

分享25个实用的博客,有助你提高编程技巧

编程是一个不断变化的领域,一旦你选择了它作为你的职业,你就不可能停下学习的脚步了.因为科技的发展月新日异,要跟得上它发展的脚步,你必须不断地努力学习.在Forbes.com最近发表的一篇文章(25 Practical Blogs To Sharpen Your Coding Skills)中,作者Tomas Laurinavicius 推荐了25个他认为很适合程序员或学习编程的人在工作或学习中阅读的博客. 1. Scott Hanselman 在微软担任网络平台开发的Scott Hanselma

偏执却管用的10条Java编程技巧

本文由 ImportNew - LynnShaw 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 经过一段时间的编码(咦,我已经经历了将近20年的编程生涯,快乐的日子总是过得很快),我们开始感谢那些好习惯.因为,你知道… “任何可能出错的事情,最后都会出错.” 这就是人们为什么喜欢进行“防错性程序设计”的原因.偏执的习惯有时很有意义,有时则不够清晰也不够聪明,也许当你想到这样写的人的时候还会觉得有点怪异.下面是我列出的的个人感觉最有用而又偏执的 10 项 Java 编程

VC/MFC 编程技巧大总结

1 toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息. 3 Java学习书推荐:<java编程思想> 4 在VC下执行DOS命令 a. system("md c:\\12"); b. WinExec("Cmd.exe /C md c:\\12", SW_HIDE); c. ShellExecute ShellExecute(NULL,

[Java]剑走偏锋的10条编程技巧

"任何可能出错的事情,最后都会出错." 这就是人们为什么喜欢进行"防错性程序设计"的原因.偏执的习惯有时很有意义,有时则不够清晰也不够聪明,也许当你想到这样写的人的时候还会觉得有点怪异.下面是我列出的的个人感觉最有用而又偏执的 10 项 Java 编程技巧.请看: 1.把字符串常量放在前面 通过把字符串常量放在比较函数equals()比较项的左侧来防止偶然的 NullPointerException 从来都不是一个坏主意,就像这样: Java代码 // Bad if